2016-03-25 2 views
0

Я создаю VBO, заполнение ее данными, то, что данные отображаются с помощью следующего кода:Порядок аргументов в glBindBuffer

// Buffer data 
glGenBuffers(1, &VBOID); 
glBindBuffer(VBOID, GL_ARRAY_BUFFER); // Shouldn't these be the other way around? 
glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW); 
glVertexPointer(3, GL_FLOAT, 0, buffer); 

// Draw arrays 
glBindBuffer(VBOID, GL_ARRAY_BUFFER); 
glEnableClientState(GL_VERTEX_ARRAY); 
glDrawArrays(GL_TRIANGLES, 0, bufferSize); 
glDisableClientState(GL_VERTEX_ARRAY); 

Однако ссылка OPENGL (https://www.opengl.org/sdk/docs/man/html/glBindBuffer.xhtml) говорит, что glBindBuffer функция принимает целевой ТИП буфера, затем идентификатор буфера, а не наоборот. Когда я помещаю их таким образом, ничто не рисует на экране, однако, когда они являются «неправильными», вокруг это кажется очень хорошим.

Для уточнения:

// Should be this 
glBindBuffer(GL_ARRAY_BUFFER, VBOID); 
// Only this works 
glBindBuffer(VBOID, GL_ARRAY_BUFFER); 

Я чувствую, что это один из тех, кто действительно тупых вопросов, но я просто не могу видеть, где проблема. Может ли кто-нибудь пролить свет на ситуацию?

Спасибо.

ответ

0

Это, безусловно, должно быть написано так:

glBindBuffer(GL_ARRAY_BUFFER, VBOID); 

Я не могу объяснить, почему вспять эти аргументы приводит к успешному чертежу. Тем не менее, в вашем коде есть несколько странностей, которые вам нужно пересмотреть:

glVertexPointer(3, GL_FLOAT, 0, buffer); 

Это немедленный код режима. Я не думаю, что это не рекомендуется, но правильный способ написать это

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, nullptr); 

Кроме того, у вас есть две ссылки на настройки клиента glEnableClientState(GL_VERTEX_ARRAY); и поддержку государственного glDisableClientState(GL_VERTEX_ARRAY); также -Это часть непосредственного режима, и его следует удалить.

Наконец, все это должно быть обернуты внутри массива объекта Vertex, например, так:

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

glGenBuffers(1, &VBOID); 
glBindBuffer(GL_ARRAY_BUFFER, VBOID); 
glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, nullptr); 
glEnableVertexAttribArray(0); 

// Draw arrays 
glBindVertexArray(vao); 
glDrawArrays(GL_TRIANGLES, 0, num_of_vertices); //num_of_vertices is usually the number of floats in the buffer divided by the number of dimensions of the vertex, or 3 in this case, since each vertex is a vec3 object. 
+0

Ах, спасибо. Вы никогда не знаете, это может иметь значение. Что конкретно определяет немедленный режим? Я думал, что это только геометрия, нарисованная с помощью glBegin() и glEnd()? – ipe369

+0

'glVertexPointer' определенно устарел, а также' glColorPointer', 'glNormalPointer' и остальные атрибуты фиксированного конвейера. –

Смежные вопросы