2014-02-11 1 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*)(sizeof(float) * 3) он будет работать нормально. Так что я предполагаю, что у (void*) есть проблемы. Однако он работал отлично, прежде чем я начал реализовывать это в классе. я бы пропустил код

OS: Mavericks, HD5000, Clang компилятор в Xcode

+0

Это кажется правильным, единственное, что отличается от моего кода: я не называю 'glBindVertexArray' в любом месте, я просто использую мой буфер вершин и вызываю' glEnableVertexAttribArray' после 'glVertexAttribPointer'. –

+0

Hm. По-прежнему получается '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