昨天,我调查了顶点缓冲区对象设置中的一个奇怪的崩溃。我刚刚从普通颜色切换到纹理,所以我的顶点缓冲区对象现在包含一个
数组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。)
答案 0 :(得分:1)
这不应该崩溃。您很可能发现了驱动程序错误。请向AMD报告,以便他们能够解决问题。