亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Golang 中繪制像素緩沖區到框架的跨平臺方式?

在 Golang 中繪制像素緩沖區到框架的跨平臺方式?

Go
白豬掌柜的 2022-12-19 20:03:26
假設我有一個內存位圖/像素網格,我想在某種窗口中將它們全部寫到屏幕上。例如:[ [255,0,0],[200,100,100]... [255,0,100],[155,200,100]... ...]有沒有一種簡單而高效的方法來做到這一點?我很樂意使用 OpenGL 或 Vulkan,但它們在這里似乎有點矯枉過正。任何仍然允許我捕獲鼠標/鍵盤輸入的東西的獎勵積分,但如果它使事情復雜化,我很樂意自己管理這部分。我個人在 Linux 上工作,如果它不能移植到 Windows,我也可以接受,但這會很好。編輯:只是根據 Ben Hoyt 的評論對此進行了更新 - 我的目標是提供令人耳目一新的框架,將用例想象成編寫 GIF 播放器。給定一組這些幀,我想按順序顯示它們,并在它們之間顯示一個相當低的顯示。
查看完整描述

2 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

如果您的目標只是將圖像加載到屏幕上,這里有一種使用 OpenGL 和 GLFW 的直接方法。您可以使用像 Fyne 這樣的庫來執行此操作,但它已經在內部使用了 OpenGL 和 GLFW(以及許多其他依賴項),因此您最好去掉中間人。


這是我的樣板程序,它使用 OpenGL 紋理和幀緩沖區將圖像 blits 到屏幕。


package main


import (

    "image"

    "runtime"


    "github.com/go-gl/gl/all-core/gl"

    "github.com/go-gl/glfw/v3.3/glfw"

)


func init() {

    // GLFW: This is needed to arrange that main() runs on main thread.

    // See documentation for functions that are only allowed to be called from the main thread.

    runtime.LockOSThread()

}


func main() {

    err := glfw.Init()

    if err != nil {

        panic(err)

    }

    defer glfw.Terminate()


    window, err := glfw.CreateWindow(640, 480, "My Window", nil, nil)

    if err != nil {

        panic(err)

    }


    window.MakeContextCurrent()


    err = gl.Init()

    if err != nil {

        panic(err)

    }


    var texture uint32

    {

        gl.GenTextures(1, &texture)


        gl.BindTexture(gl.TEXTURE_2D, texture)

        gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)

        gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)

        gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)

        gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)


        gl.BindImageTexture(0, texture, 0, false, 0, gl.WRITE_ONLY, gl.RGBA8)

    }


    var framebuffer uint32

    {

        gl.GenFramebuffers(1, &framebuffer)

        gl.BindFramebuffer(gl.FRAMEBUFFER, framebuffer)

        gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)


        gl.BindFramebuffer(gl.READ_FRAMEBUFFER, framebuffer)

        gl.BindFramebuffer(gl.DRAW_FRAMEBUFFER, 0)

    }


    for !window.ShouldClose() {


        var w, h = window.GetSize()


        var img = image.NewRGBA(image.Rect(0, 0, w, h))


        // -------------------------

        // MODIFY OR LOAD IMAGE HERE

        // -------------------------


        gl.BindTexture(gl.TEXTURE_2D, texture)

        gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, int32(w), int32(h), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(img.Pix))


        gl.BlitFramebuffer(0, 0, int32(w), int32(h), 0, 0, int32(w), int32(h), gl.COLOR_BUFFER_BIT, gl.LINEAR)


        window.SwapBuffers()

        glfw.PollEvents()

    }

}


查看完整回答
反對 回復 2022-12-19
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

我最終為此使用了 Fyne,以支持跨平臺和支持快速刷新的目標。如果有人知道在屏幕上放置像素緩沖區的本機方法,請隨時在這里發表評論,但這看起來非常輕量級并且本機適用于 Go。關于如何正確執行此操作的我的 GHI 可以在這里看到:https ://github.com/fyne-io/fyne/issues/3052

以 60 FPS 播放大量連續光柵幀:

https://i.stack.imgur.com/YkcFW.gif

查看完整回答
反對 回復 2022-12-19
  • 2 回答
  • 0 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號