2014-02-11 59 views
1

我有我的代碼有問題:(OpenGL的4.1核心語境下,我使用VertexArrayObjects)glVertexAttribPointer(偏移?)給GL_INVALID_OPERATION

//This is a member method, vertexArrayObject and vertexBufferObject are of course generated using glGenVertexArrays & glGenBuffers 
glBindVertexArray(vertexArrayObject); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, 0); 
Draw::debugLogGLError(); // OpenGL Error #0 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(sizeof(float) * 3)); 
Draw::debugLogGLError(); // OpenGL Error #1282 
glEnableVertexAttribArray(2); 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (void*)(sizeof(float) * 6)); 
Draw::debugLogGLError(); // OpenGL Error #1282 
glBindVertexArray(0); 

抽獎:: debugLogGLError()簡單地打印出最新的錯誤代碼到控制檯

void Draw::debugLogGLError(void){ 
    std::cout << "OpenGL Error #" << glGetError() << std::endl; 
} 

如果我刪除了偏移​​它將運行得很好。 所以我假設這是(void*)有問題。然而,在我開始在課堂上實施這個之前,它工作得很好。 我可能會錯過一些代碼

OS:小牛,HD5000,鏘編譯器在Xcode

+0

這似乎是正確的,唯一不同於我的代碼的是:我不會在任何地方調用'glBindVertexArray',我只是裝入我的頂點緩衝區,並且在'glVertexAttribPointer'後面調用'glEnableVertexAttribArray'。 –

+0

嗯。仍然獲得'GL_INVALID_OPERATION'。我讀過使用核心上下文時必須實現頂點數組對象 – Phlenum

+0

您可以發佈頂點緩衝區的初始化代碼嗎? –

回答

1

根據http://www.opengl.org/wiki/GLAPI/glVertexAttribPointer

GL_INVALID_OPERATION​ is generated if size​ is GL_BGRA​ and type​ is not GL_UNSIGNED_BYTE​, GL_INT_2_10_10_10_REV​ or GL_UNSIGNED_INT_2_10_10_10_REV​. 
GL_INVALID_OPERATION​ is generated if type​ is GL_INT_2_10_10_10_REV​ or GL_UNSIGNED_INT_2_10_10_10_REV​ and size​ is not 4 or GL_BGRA​. 
GL_INVALID_OPERATION​ is generated if type​ is GL_UNSIGNED_INT_10F_11F_11F_REV​ and size​ is not 3. 
GL_INVALID_OPERATION​ is generated by glVertexAttribPointer if size​ is GL_BGRA​ and noramlized​ is GL_FALSE​. 
GL_INVALID_OPERATION​ is generated if zero is bound to the GL_ARRAY_BUFFER​ buffer object binding point and the pointer​ argument is not NULL​. 
GL_INVALID_OPERATION​ is generated if no vertex array object is bound. 

前4顯然不是這樣的,所以必須是一個最後一個2.最後一個不能這樣,因爲它不總是拋出錯誤,最後一個會拋出錯誤。因此,根據維基的問題是:

GL_INVALID_OPERATION​ is generated if zero is bound to the GL_ARRAY_BUFFER​ buffer object binding point and the pointer​ argument is not NULL​. 

這意味着vertexBufferObject在你的代碼是0,因此不是一個有效的緩衝對象。如果情況並非如此,我想你只是偶然發現了一個重大的驅動程序錯誤。

+0

謝謝!我剛剛查看了我的代碼,發現'vertexBufferObject'爲0.一個令人尷尬的錯誤... – Phlenum