正如我们最终都知道的那样,规范是一回事,而实现是另一回事。我们自己造成的大多数错误,但有时并非如此。
我认为制作一个小清单非常有用:
请务必发布相关的显卡和驱动程序版本。
答案 0 :(得分:2)
让我开始吧:
如果在您的顶点着色器中有attribute
(in
)变量,其名称在gl_
之后以词汇方式存在,则您无法使用内置属性,即gl_VertexID
和gl_InstanceID
。如果您尝试,着色器将无法工作(可能是空白屏幕)。
仅适用于GLSL 3.3及更高版本或GL_ARB_explicit_attrib_location扩展名。
通过在顶点着色器中将layout(location=0)
附加到其声明中,将任何属性的位置显式定义为等于0。您可以,但不需要将此用于其他属性;重要的是,任何属性都需要具有等于0的位置。执行此操作后,命名不再重要。
使用名称约定,要求您命名以a_
开头的属性变量,这不会损害您的代码可读性,并且会在gl_
(安全区域)之前将所有这些变量设置为词法。
答案 1 :(得分:1)
另一个gl_VertexID错误:
这在Macbook上发生。 OS X Lion附带的支持OpenGL 3.2的新驱动程序可能已经解决了这个问题,但是许多框架只配置为使用旧版2.1驱动程序,因此这仍然是相关的。
如果在读取顶点着色器中的另一个属性之前读取gl_VertexID,则后一个属性将返回垃圾数据。如果另一个属性是gl_Color,无论它是如何使用的,都不会呈现任何内容。访问其他内置属性可能会导致其他奇怪的行为。
如果必须使用gl_VertexID,请先阅读所需的所有其他属性。如果您首先读取另一个属性,然后是gl_VertexID,则该属性的任何后续读取都将正常工作。