【问题标题】:glBindAttribLocation index 0glBindAttribLocation 索引 0
【发布时间】:2011-07-08 17:17:04
【问题描述】:

当我尝试将属性绑定到索引 0 时,着色器程序无法链接,信息日志提供的唯一信息是:

顶点着色器链接失败,片段着色器链接。

根据 opengl 文档

此命令使顶点着色器可以为属性变量使用描述性名称,而不是从 0 到 GL_MAX_VERTEX_ATTRIBS -1 编号的通用变量。

所以将属性绑定到索引 0 应该可以工作。虽然它不是很重要,但我很好奇为什么我不能将属性绑定到索引 0。欢迎任何建议。

【问题讨论】:

  • 您是在 before 还是 after 将顶点着色器附加到程序对象上调用glBindAttribLocation?另外,您是否在glBindAttribLocation 之后立即检查了glGetError
  • 我在之后调用它。 glGetError 不返回错误。 glBindAttribLocation 适用于其他索引。 (编辑:附加后,链接前)
  • 嗯听起来应该可以工作:(
  • 我在另一台装有 nVidia 显卡的电脑上试了试。结果相同。这可能与我的着色器有关。如果它不是并且给您带来不便,您可以自己尝试一下,看看您是否得到相同的结果。
  • 我发现了问题(这导致了其他问题):在我的顶点着色器中,我已经从使用 gl_Vertex 切换到使用我自己的属性“顶点”,但在我的着色器中的一个地方我忘记了更改变量名称,并且由于 gl_Vertex 使用 0 索引...

标签: opengl


【解决方案1】:

引用OP评论,因为它救了我:

我发现了问题(这导致了其他问题):在我的顶点着色器中,我已经从使用 gl_Vertex 切换到使用我自己的属性“顶点”,但是在我的着色器中的一个地方我忘记更改变量名,并且由于 gl_Vertex 使用 0 索引...

【讨论】:

  • 注意:gl_Vertex使用属性0。通用顶点属性不允许与内置属性别名;规范对此非常很清楚。但这并没有阻止英伟达,英伟达坚持以这种方式打破规范。您不能同时使用属性 0 和 gl_Vertex,因为它们都是激发属性。所以你必须选择一个。
  • @NicolBolas,我不明白你的意思。属性 0 是一个特殊属性,在设置时会触发顶点着色器的运行,如果您在着色器中使用 gl_Vertex,gl_Vertex 将获得您设置为属性索引 0 的值。考虑到您需要调用 @987654323,这很有意义@在使用glBegin()glEnd()绘制时设置其他属性后。
  • 您所描述的内容在您的机器上有效并不意味着它应该有效。 OpenGL规范对此非常清楚。 glVertexAttrib(0, ...)glVertex(...) 不同。它们都引发了顶点的执行,但glVertexAttrib(0, ...) 不应该在顶点着色器中提供gl_Vertex曾经。 NVIDIA 的驱动程序做到了,但这并不意味着他们是正确的。这是一个错误,NVIDIA 尚未修复,并且有各种迹象表明他们不会修复它。他们甚至认为这种别名是一项功能,尽管规范禁止这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2021-07-13
  • 2013-04-02
  • 1970-01-01
相关资源
最近更新 更多