严格支持nVidia OpenGL(OpenGL 3.2)

4
虽然AMD非常严格地遵循OpenGL规范,但nVidia在不遵循规范的情况下也经常能够正常工作。例如,nVidia支持在CPU内存中使用元素索引(用于glDrawElements),而AMD仅支持从元素阵列缓冲区中支持元素索引。
我的问题是:是否有一种方法可以使用nVidia驱动程序强制执行严格的OpenGL行为?目前,我对Windows/OpenGL 3.2/FreeGlut/GLEW设置的解决方案感兴趣。
编辑:如果无法在驱动程序本身上强制执行严格的行为,是否有一些OpenGL代理可以保证严格的行为(例如GLIntercept)?

1
我曾经在nVidia显卡上运行代码“完美”,然后在AMD显卡上崩溃得很惨。不幸的是,我只能广泛使用glGetError(),因为即使你得到错误,nVidia有时仍然可以正常工作。如果可能的话,我还会研究一下ARB_Debug_output,我相信那个是4.x以上版本才有的。 - finlaybob
3
使用核心配置上下文是向驱动程序暗示禁止使用已弃用行为的非常强的提示。但我看到所有供应商都允许在核心上下文中使用仅适用于兼容性配置文件的内容。如果您真的想执行严格的一致性,则最好的方法是熟悉规范,并仅使用在您的上下文中_应该_可用的功能。话虽如此,gDEBugger可以配置为在您进行已弃用的API调用时发出警告。 - Andon M. Coleman
@AndonM.Coleman 我的问题不是过时的API调用,而是过时的使用方式,因此我认为gDEBugger或GLIntercept不会发现这样的问题(?)。 - Mortennobel
1
它应该还会测试API调用中弃用的标记,例如在对glTexImage2D(...)的调用中使用的GL_LUMINANCE_ALPHA。然而,确定传递的指针是客户端内存还是VBO偏移量要困难得多,我想唯一检测这种行为的方法就是测试是否绑定了元素数组VBO。我自己从未尝试过这种情况,因此不知道它是否能够检测到这种特殊情况。 - Andon M. Coleman
2个回答

4
没有一个供应商严格执行规范。无论是AMD,nVidia,Intel,PowerVR等,它们都有自己的特点,你必须学会与它们共存,可惜的是。这就是每个供应商实现自己的GLSL编译器,而不是Microsoft在D3D中实现唯一的HLSL编译器的让人烦恼之处。 ANGLE项目试图通过提供一个单一的着色器验证器来在很大程度上缓解这个问题,这个验证器被多个主要的Web浏览器所共享,但这是一个艰苦的斗争,而且这只适用于大部分WebGL。当每个供应商都自己实现整个API时,你总会有实现差异。
现在,Khronos组织已经认真承担起为桌面OpenGL建立一套符合性测试的任务,就像他们为WebGL / OpenGL ES所做的那样,事情可能开始变得更好了一点。但是强制驱动程序在严格符合模式下运行并不是一件标准的事情-可能会有类似于#pragmas的东西提示编译器更加严格地行事,但这些都是供应商特定的。
顺便说一句,我意识到这个问题与GLSL本身无关,但这是我能给出的最好的例子。

2
我想就标准GLSL编译器的事情发表一下意见。关于现代OpenGL,我一直感到遗憾的是缺乏以更低级别的方式提供着色器的功能,例如AST或某种中间低级代码(例如LLVM中间代码),然后由架构后端将其转换为优化的机器代码。这将允许人们发明自己的着色器语言前端,使运行时着色器生成器的开发更加容易,最重要的是将允许开发和发布标准GLSL编译器。 - datenwolf

0

不幸的是,确保您的OpenGL代码能在目标硬件上正常工作的唯一方法是进行测试。理论上,编写符合标准的代码应该能够在任何地方运行,但可悲的是,并非总是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接