2011-02-28 63 views
2

我在我的應用程序中使用GLEE,並且在普通Windows上一切正常。檢查所有使用的OpenGL擴展

但是,在虛擬化環境下運行時,我的應用程序無法正常工作。要麼是崩潰,要麼就是呈現黑色。這可能是由於缺少一些OpenGL擴展。我試圖找出所有使用的擴展名,並在程序啓動時檢查它,以便警告用戶。這在碰撞事件中已經解決了。但是,在渲染黑色的情況下,我沒有得到任何擴展名缺失警告。我懷疑這是因爲我錯過了一些延期檢查。所以我的問題是。

是否有任何好方法可以識別全部在應用程序中使用的OpenGL擴展,以便人們可以爲它們添加檢查?

回答

1

可能的,但它會有點工作。

GLEE提供延遲加載,因此您應該可以對其進行簡單修改以記錄每個被調用的函數。懶惰的加載代碼(我沒有看過它,但是它可能類似)可能看起來像這樣:
if(funcptr == 0){_ _ glee_load_fp(funcptr,_ _ FUNCTION _)} funcptr參數); 。

因此,你首先要做的就是記錄你以這種方式實際調用的所有函數,然後你必須對擴展進行反向查找映射函數名稱。通常這將意味着解析glext.spec,這是一個恐怖。但幸運的是,您可以從GLEE網站下載GLEE中所有內容的xml表示,這非常適合使用。

+2

這將工作只爲引進新的程序擴展。像GL_ARB_cubemap這樣的擴展只能引入新的標記,不會用這個來覆蓋。 – datenwolf 2011-02-28 09:55:46

+0

沒錯,我沒有想到僅僅引入新的常量(或者GLSL指令,如texgrad)的擴展。儘管我無法想象如何在程序上發現是否在不知不覺中使用了其中之一。那麼,可以編寫一個解析器來遍歷整個源代碼,並提取所有以GL_或gl開頭的標記(以及可能的wgl和glx)。事實上,我猜想有一定程度的sed-fu的人可能會這樣做,而無需爲它編寫程序。那麼剩下的就是與xml規範的匹配。 – Damon 2011-02-28 12:18:09

0

您也可以查看GLEW的擴展以及/而不是。

它提供宏來查詢實現的擴展。

http://glew.sourceforge.net/basic.html

+0

是的,這是在啓動時使用的規範化的東西,但是這假定ronag知道使用了哪些擴展,這顯然不是這種情況。 – Damon 2011-02-28 09:40:17

+0

@ dm.skt:這表明饒是太懶惰了:一個總是測試所需設施的可用性。人們不能只假設那裏有一座橋樑,並加速全速駛向懸崖。如果程序需要說OpenGL-2.1功能至少檢查glGetString(GL_VERSION) – datenwolf 2011-02-28 09:59:11

+0

報告的版本號,我不會稱自己懶惰。我檢查我知道我的程序正在使用的所有擴展名。但是,我可能錯過了一些擴展。這就是爲什麼我想通過編程檢查使用哪些擴展。 – ronag 2011-02-28 10:45:55