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()
}
}

TA貢獻1906條經驗 獲得超10個贊
我最終為此使用了 Fyne,以支持跨平臺和支持快速刷新的目標。如果有人知道在屏幕上放置像素緩沖區的本機方法,請隨時在這里發表評論,但這看起來非常輕量級并且本機適用于 Go。關于如何正確執行此操作的我的 GHI 可以在這里看到:https ://github.com/fyne-io/fyne/issues/3052
以 60 FPS 播放大量連續光柵幀:
https://i.stack.imgur.com/YkcFW.gif
- 2 回答
- 0 關注
- 124 瀏覽
添加回答
舉報