9

正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。

我相信列出以下内容会很有用:

GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GLSL 的实现有关的错误是什么?

请记住始终张贴相关的显卡驱动程序版本

4

2 回答 2

2

让我开始吧:

  • GPU:在 AMD/ATI Radeon HD 4650 上确认
  • 类型:GLSL 问题
  • GL 版本相关:在 3.3 上确认,可能是 3.1 及更高版本(甚至更早)
  • 相关链接:http ://forums.amd.com/devforum/messageview.cfm?catid=392&threadid=139288
  • 驱动程序版本:在 Catalyst 10.10 (9-28-2010) 上确认
  • 状态:截至 2010 年 11 月 27 日,它有一个修复程序,但它显然还没有达到公共驱动程序版本(所以即使修复程序被发布,驱动程序版本不是最新版本的用户仍然会受到影响几个月)
  • 描述:

如果在您的顶点着色器中有任何attribute( in) 变量,其名称在词法上是在 之后gl_,那么您不能使用内置属性,即gl_VertexIDand gl_InstanceID。如果您尝试,着色器将无法工作(可能是空白屏幕)。

  • 解决方法(新):

仅适用于 GLSL 3.3 及更高版本,或带有GL_ARB_explicit_attrib_location扩展。

layout(location=0)通过附加到顶点着色器中的声明,将任何属性的位置明确定义为等于 0 。您可以,但不需要将其用于其他属性;重要的是 ANY 属性的位置必须等于 0。这样做之后,命名就不再重要了。

  • 解决方法(替代):

使用名称约定,要求您以 开头的属性变量命名a_,这不会损害您的代码可读性,并且会使所有它们都在词法上之前gl_(安全区)。

于 2010-11-27T14:29:32.017 回答
1

另一个 gl_VertexID 错误:

  • 显卡:NVIDIA GeForce 9400M
  • 类型:GLSL 问题
  • 驱动版本:NVDANV50Hal 1.6.36
  • OpenGL 版本:2.1,使用 GL_EXT_gpu_shader4 扩展的 GLSL 1.2

这发生在 Macbook 上。OS X Lion 附带的启用 OpenGL 3.2 的新驱动程序可能已经解决了该问题,但许多框架仅配置为使用旧版 2.1 驱动程序,因此这仍然是相关的。

如果在读取顶点着色器中的另一个属性之前读取 gl_VertexID,则后一个属性将返回垃圾数据。如果另一个属性是gl_Color,不管它是如何使用的,都不会被渲染。访问其他内置属性可能会导致其他奇怪的行为。

  • 解决方法:

如果您必须使用 gl_VertexID,请先阅读您需要的所有其他属性。如果您先读取另一个属性,然后再读取 gl_VertexID,则对该属性的任何后续读取都可以正常工作。

于 2012-05-18T07:32:52.177 回答