2012年5月1日 星期二

OpenGL 貼圖錯誤!?

最近開始進行用 OpenGL 實作 2D 圖形庫, 在開發過程出現了一個困擾的錯誤:

連續兩個四邊型(由兩三角形組成)物件各使用各自不同的貼圖, 但顯示後卻都是同一張圖!!

我花了很多時間想要找出哪裡作錯, 是我 glBindTexture 用錯導致? 是我不熟悉 OpenGL 的 pipeline 流程?

後來我換了電腦測試, 同一個 exe 在公司裡的電腦執行是正確的!

我越發奇怪,想真的是我不懂 OpenGL 了, 我開始找了網路最簡單的 texture 範例 (NeHe網站), 人家可是 OpenGL 高手可以了吧, 我改了一下把他的範例原是一張貼圖, 弄成貼兩張不同圖, 結果在家裡的電腦跑還是一樣出錯!

我又把該修改範例的 exe 丟給我朋友測試, 他說他那邊正常!



這兩天除了拜 goolge 外, 我反覆修改我的程式碼, 終於試出了兩個方法了, 兩張圖之間先開關一次 texture 功能或 unbind 一次 texture 如下

              glEnable (texture 2d)
              gBindTexture (1)
              texture by glDrawArray ( )
              --->glDiable (texture 2d)
              --->glEnable (texture 2d)
              gBindTexture (2)
              texture by glDrawArray ( )

            或是
            ....
            --> glBindTexture ( 0 )
            gBindTexture (2)
            ....

兩張圖就可以各自顯示了, 可以我個性, 這是沒有道理的解法. 接受沒道理的解法就是向 BUG 認輸.

旋即我想到了一件事. 是不是我的顯示卡 driver 有問題? 我家理的電腦是用最新的 Win7, 安裝OS 時沒出現有 Driver不相容的警告阿, Windows 都上全彩高解析顯示正常了!?

回到家, 還是查了一下我的 win7, 發現裝置那邊一直都用 OS 內建的顯示卡 driver, oh~ 該不會....

下載 OpenGL info 小工具程式, 用他去查...

廠商: microsoft
Renderer: GDI renderer
version 1.1
幾乎全部的 entension 都不支持

抓了幾個 OpenGL test 跑, 有幾個一跑就當機,  有的說需要 OpenGL 1.2 才給跑, 有的跑起來有錯誤, 有一個能跑, 他是貼圖人頭自轉, 但 FPS 7!!!

所以我上了 nvidai 抓了最新的版本安裝, 再跑一次 OpenGL info...

廠商: NVidia
Renderer: Geforce 7300GT
version 2.2
幾乎全部的 entension 都支持了

測試剛剛那個貼圖人頭自轉 FPS 230!!!

把我程式"沒道理的解法"移除, 再跑一次也正常了!

所以估計是 GDI opengl renderer 的  bug..

反正真正要玩遊戲本來就安裝最新顯卡來的 driver, 不會有人用 GDI renderer 那麼差的效能, 所以 bug 微軟根本不管. (對啦, 我是好幾年沒玩商業 3D 遊戲了)

所以經驗是: Opengl 程式一開始需要檢查 version 和 vendor, 看到 vendor = Microsoft 就發出警告!

沒有留言:

張貼留言