我想知道nVidia OpenGL驱动程序在固定管线(未连接着色器)内的属性位置:
glVertex = 0
glColor = 3
glNormal = ?
glTexCoord = ?
glMultiTexCoord 0..7 = ?
glSecondaryColor = ?
glFog = ?
根据经验,我找到了“顶点”和“主色”位置,但仍然很高兴了解它们。
如果您想知道原因,则出于兼容性原因,甚至出于GLSL调试的目的(只是查看在着色器尚不可用时是否将正确的数据传递到正确的位置)等等。
在NVIDIA驱动程序之外,此操作不起作用(可靠地)。兼容的驱动程序将仅别名glVertexPointer (...)
为属性插槽0。NV用他们无穷的智慧在多年前设计了一个标准的非标准方案,在该方案中,他们将所有固定功能指针都别名为某些属性位置,但是我不知道新的NV驱动程序是否支持此方法(老实说,我从来都不关心尝试,这是一个糟糕的做法)。您也许仍然可以找到NV的别名映射文档,但是您无法利用他们的非标准行为使任何人受益。
尽管其他驱动程序也可以将固定功能指针的别名别名为通用顶点属性位置,但不存在有关其映射的文档。与NV不同,我不相信映射不会在驱动程序版本,硬件或平台之间更改。实际上,即使使用NV驱动程序,您也不应利用此功能-它是为了促进传统支持,而不是作为新软件的功能使用。
底线是,改用通用顶点属性或使用相容性分布和版本GLSL的是还支持专门为获取固定功能顶点数据设计了预先声明的变量(例如gl_Color
,gl_Normal
,gl_MultiTexCoord0...7
,...)。但是不要同时使用两种描述方式。
还需要一些时间进行审查glGetPointerv (...)
。如果要在GLSL之外获取有关固定功能指针的信息,这是正确的方法。不要依赖顶点属性别名,因为属性位置的概念从根本上讲是可编程的管道功能。它甚至在2.0之前的未扩展OpenGL中都不存在(它是ARB Vertex程序汇编语言引入的,并由GLSL提升为核心)。
尽管我仍然强烈建议您不要使用此信息,但我能够准确找到您想要的:
顶点属性别名
GLSL试图消除顶点属性的混叠,但这是NVIDIA硬件方法不可或缺的,并且对于保持与NVIDIA客户所依赖的现有OpenGL应用程序的兼容性是必不可少的。
因此,NVIDIA的GLSL实现不允许内置的顶点属性与通过glBindAttribLocation分配给特定顶点属性索引的通用顶点属性发生冲突。例如,您不应该使用gl_Normal(内置的顶点属性),也不要使用glBindAttribLocation将名为“ whatever”的通用顶点属性绑定到顶点属性索引2,因为gl_Normal别名是索引2。
如果您想知道,ARB Vertex程序扩展规范的表X.1中也对此进行了概述。我特别提到NV的唯一原因是因为他们选择重用GLSL中的别名,而来自其他供应商的兼容实现将仅遵循GLSL中的第一个别名(glVertexPointer (...)
至0)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句