正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。
我相信列出以下内容会很有用:
GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GLSL 的实现有关的错误是什么?
请记住始终张贴相关的显卡和驱动程序版本。
让我开始吧:
如果在您的顶点着色器中有任何attribute
( in
) 变量,其名称在词法上是在 之后gl_
,那么您不能使用内置属性,即gl_VertexID
and gl_InstanceID
。如果您尝试,着色器将无法工作(可能是空白屏幕)。
仅适用于 GLSL 3.3 及更高版本,或带有GL_ARB_explicit_attrib_location扩展。
layout(location=0)
通过附加到顶点着色器中的声明,将任何属性的位置明确定义为等于 0 。您可以,但不需要将其用于其他属性;重要的是 ANY 属性的位置必须等于 0。这样做之后,命名就不再重要了。
使用名称约定,要求您以 开头的属性变量命名a_
,这不会损害您的代码可读性,并且会使所有它们都在词法上之前gl_
(安全区)。
另一个 gl_VertexID 错误:
这发生在 Macbook 上。OS X Lion 附带的启用 OpenGL 3.2 的新驱动程序可能已经解决了该问题,但许多框架仅配置为使用旧版 2.1 驱动程序,因此这仍然是相关的。
如果在读取顶点着色器中的另一个属性之前读取 gl_VertexID,则后一个属性将返回垃圾数据。如果另一个属性是gl_Color,不管它是如何使用的,都不会被渲染。访问其他内置属性可能会导致其他奇怪的行为。
如果您必须使用 gl_VertexID,请先阅读您需要的所有其他属性。如果您先读取另一个属性,然后再读取 gl_VertexID,则对该属性的任何后续读取都可以正常工作。