Цвета в OpenGL VBO?

#opengl #vbo

#opengl #vbo

Вопрос:

Я пытаюсь добавить цвета к своему объекту, используя единую структуру и один VBO в OpenGL. Для этого у меня есть Vertex созданная мной структура, которая выглядит следующим образом:

 typedef struct {
    float x;
    float y;
    float z;
    float r;
    float g;
    float b;
    float a;
} Vertex;
  

Я уже знаю, что я правильно устанавливаю все координаты и цвета, чтобы получить то, что я хочу, потому что я провел тест, повторяющий каждый объект, который я сохранил в своем списке, и вычерчивающий точки и устанавливающий цвета с помощью glVertex3f и glColor4f (это было значительно медленнее, чем то, что я ищу). Но когда я пытаюсь нарисовать это с помощью VBO, я просто получаю огромное количество цветных треугольников, разбросанных повсюду.

Часть моего цикла рендеринга, которая рисует VBO, выглядит следующим образом:

 glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, NULL);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, offsetof(Vertex, r), NULL);
glDrawArrays(GL_TRIANGLES, 0, vertex_amount);
glBindBuffer(GL_ARRAY_BUFFER, 0);
  

Что я делаю не так?

Ответ №1:

 glVertexPointer(3, GL_FLOAT, 0, NULL);
                             ^
  

Значения позиций в массиве Vertex s не плотно упакованы, поэтому вы не можете использовать 0 для stride . Использовать sizeof( Vertex ) .

 glColorPointer(4, GL_FLOAT, offsetof(Vertex, r), NULL);
                            ^^^^^^^^^^^^^^^^^^^
  

Я … не уверен, к чему вы здесь клоните. Возможно, вы подумали, что 3-й параметр glVertexPointer() / glColorPointer() был pointer вместо stride ? Переместите свой offsetof() к последнему параметру, pointer .

Все вместе:

 glVertexPointer(3, GL_FLOAT, sizeof( Vertex ), offsetof(Vertex, x) );
glColorPointer(4, GL_FLOAT, sizeof( Vertex ), offsetof(Vertex, r) );
  

Возможно, вам придется привести pointer значения параметров к void* в зависимости от того, как вы реализовали offsetof() .