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

问题描述:

昨天,我调查了一个奇怪的崩溃在我的顶点缓冲区对象的设置。我只是从普通的颜色切换到纹理,所以我的顶点缓冲区对象现在包含的为什么glEnableVertexAttribArray会根据呼叫顺序在某些系统上崩溃?

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在第一帧期间以后调用。)

这是不应该发生崩溃。你很可能发现了一个驱动程序错误。请报告给AMD,以便他们能够修复它。