2011-02-28 65 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