2012-11-21 95 views
2

最近我一直在使用glsl着色器,剛剛開始使用新的鑲嵌細分階段。 它完美的工作了一段時間,然後突然間,BANG,它失敗了。 每當我運行它與原始參數等,它打破, glDrawElements(GL_PATCHES, numIndicies, GL_UNSIGNED_INT, 0)訪問衝突在0x00000054。glDrawElements只會導致與GL_PATCHES的訪問衝突

我已經梳理了我的代碼,從我所看到的內容中,所有內容都會檢查出來。 但是,當我將GL_PATCHES更改爲GL_TRIANGLES時,它的功能完美無缺。當然,在禁用曲面細分控制和eval着色器之後。 我也試過glDrawArrays,但仍然失敗,GL_PATCHES,所以我相當有信心它與此有關。

目前我在幾何着色器中使用基本曲面細分,但那就是甘尼變快了。

我使用ATI Mobility Radeon HD 5650運行Windows 7 x64,據我所知,最新的驅動程序是什麼。 它說,異常發生在atioglxx.dll某處,如果有幫助。 這是一些代碼。

GLuint CreateIcosahedron(vec3, unsigned int&); 

void DrawScene(){ 
    static unsigned int numindices = 0; 
    static GLuint vao = CreateIcosahedron(vec3(0,0,0), vec3(1,2,1), numindices); 

    glBindVertexArray(vao); 
    glDrawElements(GL_PATCHES, numindices, GL_UNSIGNED_INT, 0); 
    glBindVertexArray(0); 
} 

GLuint CreateIcosahedron(vec3 center, unsigned int& numindices){ 
    GLuint vaoID; 
    GLuint vboID; 
    GLuint iboID; 

    const int indices[] = { 
      // indices omitted for your viewing pleasure 
    }; 
    const vec3 vertices[] = { 
      // vertices omitted for your viewing pleasure 
    }; 

    const GLuint uPosition = 0; 
    numindices = sizeof(indices)/sizeof(indices[0]); 

    glGenVertexArrays(1, &vaoID); 
    glBindVertexArray(vaoID); 

    glGenBuffers(1, &vboID); 
    glBindBuffer(GL_ARRAY_BUFFER, vboID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    glVertexAttribPointer(uPosition, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(uPosition); 

    glGenBuffers(1, &iboID); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

    return vaoID; 
} 

我在做什麼錯? :c

回答

0

我以前見過glDrawElements之前沒有正確設置VAO。你的初始化代碼看起來是正確的,但問題可能是你沒有在函數結束時解除綁定你的VAO。這意味着任何後續調用glBindBuffer等都可以改變VAO狀態。嘗試在CreateIcosahedron()的末尾解除綁定VAO,看看是否有幫助。

[編輯] 如果你的代碼看起來和你上面發佈的完全一樣,那麼這可能無濟於事。看起來你並沒有解除綁定VAO,但是在函數返回後立即綁定它。爲了幫助您縮小問題範圍,您應該知道glDrawElements的行爲會根據調用時是否綁定元素數組緩衝區而發生變化。如果有數組綁定,則最後一個參數被解釋爲元素數組中的字節偏移量。否則它會被解釋爲一個指針,我認爲這是你的情況。

+0

謝謝,我會給你一個鏡頭 – Manpat

+0

它完美的作品。在函數的末尾解除頂點數組的綁定,解決了所有問題。謝謝噸:D 你已經救了我幾小時的頭髮拉:p – Manpat

+0

我到這裏因爲我有同樣的0x00000054崩潰。原來,這是因爲我沒有將tesselation控制和評估着色器附加到程序對象。 – RelativeGames