众所周知,规范是一回事,实现是另一回事。我们自己引起的大部分错误,但有时情况并非如此。
我认为制作一个小列表会很有用:
目前已知的与OpenGL和GLSL最新版本的实现相关的GPU驱动程序中存在哪些错误?
请记住始终发布相关的显卡和驱动程序版本。
众所周知,规范是一回事,实现是另一回事。我们自己引起的大部分错误,但有时情况并非如此。
我认为制作一个小列表会很有用:
请记住始终发布相关的显卡和驱动程序版本。
让我开始:
如果在您的顶点着色器中有任何名称在gl_
之后的attribute
(in
)变量,则无法使用内置属性,即gl_VertexID
和gl_InstanceID
。如果尝试,则着色器将无法正常工作(屏幕空白,可能)。
仅适用于GLSL 3.3及以上版本,或使用GL_ARB_explicit_attrib_location扩展。
通过在顶点着色器中的声明中附加layout(location=0)
来显式定义任何属性的位置为0。您可以但不需要对其他属性使用此功能;重要的是,任何属性都需要具有等于0的位置。这样做之后,命名就不再重要。
使用名称约定,要求您以a_
开头命名属性变量,这不会影响代码可读性,并使它们都位于gl_
之前的词汇区域(安全区域)。
gl_
都是被禁止的;根据规范,你应该会得到一个编译器错误。 - Nicol Bolas另一个gl_VertexID错误:
这种情况发生在Macbooks上。可能新的启用OpenGL 3.2的驱动程序(随OS X Lion一起提供)已经修复了该问题,但是许多框架仅配置为使用传统的2.1驱动程序,因此仍然相关。
如果在顶点着色器中先读取gl_VertexID,再读取另一个属性,则后者属性将返回垃圾数据。如果另一个属性是gl_Color,则无论如何使用它,都不会呈现任何内容。访问其他内置属性可能会导致其他奇怪的行为。
如果必须使用gl_VertexID,请先阅读所有其他所需属性。如果您首先读取另一个属性,然后是gl_VertexID,则随后对属性的任何读取都将正常工作。