为什么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,以便他们能够修复它。