我使用用 Golang 編寫的相同 OpenGL 代碼在 640x480 像素空間中繪制兩條線。我很困惑,因為在 Linux 中兩條線都正確繪制,但在 Windows10 中只繪制了其中一條。是什么導致了 OpenGL 行為的差異?第 1 行:0,0 - 639,479(僅適用于 Linux)第 2 行:50,0 - 0,50(適用于 Linux 和 Windows10)在 Linux 上,兩條線都正確繪制:來自 Linux 的應用程序日志:2019/08/15 02:44:12 requesting window for OpenGL 3.32019/08/15 02:44:12 graphicsStart(9): 640 x 4802019/08/15 02:44:12 OpenGL version 3.3 (Core Profile) Mesa 18.2.82019/08/15 02:44:12 OpenGL program: 32019/08/15 02:44:12 pixelToClip: 0 x 0 => -1.000000 x 1.0000002019/08/15 02:44:12 pixelToClip: 639 x 479 => 1.000000 x -1.0000002019/08/15 02:44:12 pixelToClip: 50 x 0 => -0.843506 x 1.0000002019/08/15 02:44:12 pixelToClip: 0 x 50 => -1.000000 x 0.791232在Windows10上,只繪制第二行:Windows10 的應用程序日志:2019/08/15 18:41:19 requesting window for OpenGL 3.32019/08/15 18:41:19 graphicsStart(9): 640 x 4802019/08/15 18:41:19 OpenGL version 3.3.0 - Build 21.20.16.46272019/08/15 18:41:19 OpenGL program: 32019/08/15 18:41:19 pixelToClip: 0 x 0 => -1.000000 x 1.0000002019/08/15 18:41:19 pixelToClip: 639 x 479 => 1.000000 x -1.0000002019/08/15 18:41:19 pixelToClip: 50 x 0 => -0.843506 x 1.0000002019/08/15 18:41:19 pixelToClip: 0 x 50 => -1.000000 x 0.791232這是該應用程序的完整源代碼:$ cat a.go// # recipe for running a.go (Go 1.11 or higher)// mkdir tmp ;# create dir for module// cp a.go tmp ;# put app in dir// cd tmp ;# enter dir// go mod init tmp ;# init module// go get -u github.com/udhos/basgo@mainthread ;# get lib from branch mainthread// go run a.go ;# runpackage mainimport ( "github.com/faiface/mainthread" "github.com/udhos/basgo/baslib")func main() { mainthread.Run(run)}函數 baslib.Line() 是負責繪制的主要部分,可在此處使用:https://github.com/udhos/basgo/blob/mainthread/baslib/graphics.go#L269
1 回答

米脂
TA貢獻1836條經驗 獲得超3個贊
實際上,我認為問題比我最初想象的要簡單:每次繪制一條線時,您都在調用 window.SwapBuffers() ,而實際上您應該在一幀末尾調用它一次。
現代系統上的緩沖區交換意味著“在顯示器上顯示幀緩沖區的當前內容,并為我提供一個新的屏幕外緩沖區來繪制”。沒有定義這個新的離屏緩沖區是否為空,因為 OpenGL 標準無論如何都會調用 glClear。在我的雙啟動筆記本電腦上進行的快速 C 測試對于 Linux 和 MS Windows確實有不同的行為。
因此,您的程序繪制第一行,交換緩沖區,繪制第二行,再次交換緩沖區。在我看來,Linux 實現似乎保留了幀緩沖區內容,因此當繪制第二行時,第一行仍然存在。在 MS Windows 上,我猜想新的幀緩沖區已被清除,因此第一行被非常非常短暫地“顯示”,然后被第二個幀緩沖區覆蓋,僅顯示第二行。
- 1 回答
- 0 關注
- 172 瀏覽
添加回答
舉報
0/150
提交
取消