为什么glEnableVertexAttribArray会根据呼叫顺序在某些系统上崩溃?

时间:2012-02-24 20:41:10

标签: opengl

昨天,我调查了顶点缓冲区对象设置中的一个奇怪的崩溃。我刚刚从普通颜色切换到纹理,所以我的顶点缓冲区对象现在包含一个

数组
struct VertexData { glm::vec4 pos; glm::vec2 texCoord; }

而不是

struct VertexData { glm::vec4 pos, color; }

在我的系统(英特尔芯片)上,一切进展顺利,但另一个使用专有Linux驱动程序(fglrx)的Radeon卡的系统在VBO设置中崩溃了。我们最终将其跟踪到glEnableVertexAttribArray调用,并发现

glEnableVertexAttribArray(1); //attribute location for texcoord
glEnableVertexAttribArray(0); //attribute location for position

工作时

glEnableVertexAttribArray(0); //attribute location for position
glEnableVertexAttribArray(1); //attribute location for texcoord

第一次通话时崩溃。 (请注意,属性位置在第二个片段中交换。)为什么?我能够提出的唯一解释是驱动程序错误,但这似乎不太可能,因为所有其他OpenGL应用程序都可以工作。还是有什么我忘了做的?

作为参考,我附上了apitrace的相关部分。此时,我已经设置了我的上下文,启用了GL_DEPTH_TEST,GL_CULL_FACE和GL_TEXTURE_2D,上传了一些纹理,并准备了我的着色器程序(没有明确调用glBindAttribLocation)。

glGetAttribLocation(3, in_Position) = 0
glGetAttribLocation(3, in_TexCoord) = 1

glGenVertexArrays(1, [1])
glBindVertexArray(1)

glGenBuffers(1, [1])
glBindBuffer(GL_ARRAY_BUFFER, 1)
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0x18, NULL)
glVertexAttribPointer(1, 2, GL_FLOAT, false, 0x18, 0x10)
glEnableVertexAttribArray(0) <-- this crashes with AMD/ATI fglrx driver
glEnableVertexAttribArray(1)

(稍后在第一帧中调用glBufferData。)

1 个答案:

答案 0 :(得分:1)

这不应该崩溃。您很可能发现了驱动程序错误。请向AMD报告,以便他们能够解决问题。