#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()
.