Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
严格的nVidia OpenGL支持(OpenGL 3.2)_Opengl_Nvidia - Fatal编程技术网

严格的nVidia OpenGL支持(OpenGL 3.2)

严格的nVidia OpenGL支持(OpenGL 3.2),opengl,nvidia,Opengl,Nvidia,虽然AMD严格遵守OpenGL规范,但nVidia通常在不遵守规范的情况下也能正常工作。一个例子是,nVidia支持CPU内存上的元素incides(用于glpaurements),而AMD只支持元素数组缓冲区中的元素索引 我的问题是:有没有办法使用nVidia驱动程序强制执行严格的OpenGL行为?目前我对Windows/OpenGL 3.2/FreeGlut/GLEW设置的解决方案感兴趣 编辑:如果无法对驱动程序本身强制执行严格的行为-是否有某种OpenGL代理保证严格的行为(如GLInte

虽然AMD严格遵守OpenGL规范,但nVidia通常在不遵守规范的情况下也能正常工作。一个例子是,nVidia支持CPU内存上的元素incides(用于
glpaurements
),而AMD只支持元素数组缓冲区中的元素索引

我的问题是:有没有办法使用nVidia驱动程序强制执行严格的OpenGL行为?目前我对Windows/OpenGL 3.2/FreeGlut/GLEW设置的解决方案感兴趣


编辑:如果无法对驱动程序本身强制执行严格的行为-是否有某种OpenGL代理保证严格的行为(如GLIntercept)

没有供应商严格执行规范。无论是AMD、nVidia、英特尔、PowerVR。。。不幸的是,他们都有自己的特质,你必须学会与他们一起生活。与微软在D3D中实现唯一的HLSL编译器相比,让每个供应商实现自己的GLSL编译器是一件令人恼火的事情

通过提供跨多个主要web浏览器共享的单个着色器验证器,尝试在一定程度上缓解这一问题,但这是一场艰苦的战斗,这只适用于大部分WebGL。当每个供应商自己实现整个API时,您将始终存在实现差异

现在,Khronos group已经认真地承担了为桌面OpenGL建立一套一致性测试的任务,就像他们为WebGL/OpenGL ES所做的一样,事情可能会开始变得更好。但是强制驱动程序在严格一致性模式下运行并不是一件标准的事情-可能会有
#pragmas
等提示编译器更严格地操作,但这些都是特定于供应商的


顺便说一句,我意识到这个问题与GLSL本身无关,但这是我能给出的最好的例子。

不幸的是,确保OpenGL代码在目标硬件上工作的唯一方法是测试它。理论上,简单地编写符合标准的代码应该在任何地方都能工作,但遗憾的是,情况并非总是如此

我让代码在nVidia卡上“完美”运行,然后在AMD卡上惊人地崩溃。不幸的是,我所能做的就是大量使用glGetError(),因为即使您得到了错误,nVidia有时也能正常工作。如果可以的话,我还将研究ARB_Debug_输出,我相信这是>=4.x。使用核心配置文件上下文应该是一个非常强烈的提示,提示驱动程序不允许不推荐的行为。但我看到所有的供应商都允许在核心上下文中使用只在兼容性配置文件中工作的东西。如果您真的想强制执行严格的一致性,那么最好的方法就是熟悉规范,并且只使用在您的上下文中应该可用的特性:P也就是说,gDEBugger可以配置为在您进行不推荐的API调用时向您发出警告。@AndonM.Coleman我的问题不是不推荐的API调用,而是不推荐的用法,因此我认为gDEBugger或GLIntercept不会发现此类问题(?)。它应该在API调用中测试不推荐的令牌。例如调用
glTexImage2D(…)
中的
GL\u亮度\u ALPHA
。但是,确定传递的指针是指向客户端内存还是指向VBO的偏移量要困难得多,我认为检测此行为的唯一方法是测试元素数组VBO是否绑定。我自己从来没有尝试过这种情况,所以我不知道它是否能够检测到这种特殊情况。我只是想插话说一下标准的GLSL编译器。关于现代OpenGL,我一直忽略的一点是缺少以更低级的方式提供着色器,比如AST或某种中介低级代码(比如LLVM中介,然后由体系结构后端转换为优化的机器代码)。这将允许人们发明自己的着色器语言前端,使运行时着色器生成器的开发更容易,最重要的是,将允许开发和发布标准GLSL编译器。