昨天,我調查了一個奇怪的崩潰在我的頂點緩衝區對象的設置。我只是從普通的顏色切換到紋理,所以我的頂點緩衝區對象現在包含的爲什麼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在第一幀期間以後調用。)