OpenGL 3和OpenGL 4实现中已知的缺陷问题

9

众所周知,规范是一回事,实现是另一回事。我们自己引起的大部分错误,但有时情况并非如此。

我认为制作一个小列表会很有用:

目前已知的与OpenGL和GLSL最新版本的实现相关的GPU驱动程序中存在哪些错误?

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


3
这个问题应该设为社区维基。 - elmattic
1
@Stringer - 现在只有管理员才能将问题设为 CW。当回答数超过30个时,它仍会自动转换。 - ChrisF
3
我强烈支持列出“已知驱动程序漏洞”的倡议,但我认为 Stack Overflow 可能不是有效的地方。一个起点可能是 OpenGL Wiki,但这样的数据库需要搜索、索引、驱动程序版本列表等,需要一个适当的数据库后端。 - rotoglup
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日,已有修复方法,但显然尚未发布公共驱动程序版本(因此,即使修复得到发布,使用不太新的驱动程序版本的用户仍将受到影响,大约需要数月时间)
  • 描述:

如果在您的顶点着色器中有任何名称在gl_之后的attribute (in)变量,则无法使用内置属性,即gl_VertexIDgl_InstanceID。如果尝试,则着色器将无法正常工作(屏幕空白,可能)。

  • 解决方法(新):

仅适用于GLSL 3.3及以上版本,或使用GL_ARB_explicit_attrib_location扩展。

通过在顶点着色器中的声明中附加layout(location=0)来显式定义任何属性的位置为0。您可以但不需要对其他属性使用此功能;重要的是,任何属性都需要具有等于0的位置。这样做之后,命名就不再重要。

  • 解决方法(替代方法):

使用名称约定,要求您以a_开头命名属性变量,这不会影响代码可读性,并使它们都位于gl_之前的词汇区域(安全区域)。


1
除了预定义的变量名之外,在任何变量名前使用 gl_ 都是被禁止的;根据规范,你应该会得到一个编译器错误。 - Nicol Bolas
3
@Nicol,那是真的,但与这个问题无关。请再读一遍 :) - Kos

1

另一个gl_VertexID错误:

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

这种情况发生在Macbooks上。可能新的启用OpenGL 3.2的驱动程序(随OS X Lion一起提供)已经修复了该问题,但是许多框架仅配置为使用传统的2.1驱动程序,因此仍然相关。

如果在顶点着色器中先读取gl_VertexID,再读取另一个属性,则后者属性将返回垃圾数据。如果另一个属性是gl_Color,则无论如何使用它,都不会呈现任何内容。访问其他内置属性可能会导致其他奇怪的行为。

  • 解决方法:

如果必须使用gl_VertexID,请先阅读所有其他所需属性。如果您首先读取另一个属性,然后是gl_VertexID,则随后对属性的任何读取都将正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接