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

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

Golang OpenGL線在Linux上繪制,但在Windows10上不繪制

Golang OpenGL線在Linux上繪制,但在Windows10上不繪制

Go
一只斗牛犬 2023-07-10 18:02:09
我使用用 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 上,我猜想新的幀緩沖區已被清除,因此第一行被非常非常短暫地“顯示”,然后被第二個幀緩沖區覆蓋,僅顯示第二行。


查看完整回答
反對 回復 2023-07-10
  • 1 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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