#opengl #vao
#opengl #vao
Вопрос:
Я надеялся получить некоторую помощь по вопросу OpenGL, касающемуся создания и рендеринга VAOs. Цель здесь — просто взять это:
glBegin(GL_TRIANGLES);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glVertex3f(0.5f, 0.5f, 0.0f);
glEnd();
который отображает красный квадрат в середине окна и превращает его в VAO с вершинами, цветами и индексами. Итак, это то, что у меня есть на данный момент для создания VAO (извините, если это немного длинновато для кода):
//initialize all data
verts_amt = 6;
Vertex* verts = (Vertex*)malloc(sizeof(Vertex) * verts_amt);
int* indices = (int*)malloc(sizeof(int) * verts_amt);
verts[0] = createVertex(-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f);
verts[1] = createVertex(-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f);
verts[2] = createVertex(0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f);
verts[3] = createVertex(-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f);
verts[4] = createVertex(0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f);
verts[5] = createVertex(0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f);
int i;
for(i = 0; i < 6; i )
indices[i] = i;
unsigned int vbo, ibo;
//create, bind, set data, and then unbind for the vbo and ibo
glGenBuffers(1, amp;vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, verts_amt * sizeof(Vertex), verts, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, amp;ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, verts_amt * sizeof(int), indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
//create vao, bind vao, bind and set data for vbo, bind ibo, then unbind vao
glGenVertexArrays(1, amp;vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), NULL);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, r));
glEnableVertexAttribArray(1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBindVertexArray(0);
на случай, если вам интересно, Vertex
это просто структура, состоящая из семи элементов с плавающей запятой в порядке x, y, z, r, g, b, a
. Просмотрев похожие вопросы по этой теме, я все еще не вижу, чего мне не хватает и / или что я делаю неправильно, потому что, когда я визуализирую это с помощью этих простых строк:
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, verts_amt, GL_UNSIGNED_INT, NULL);
он отображает просто белый квадрат. Имейте в виду, что я больше ничего не меняю в своем цикле рендеринга, за исключением, конечно, удаления вызовов Vertex3f
, glBegin/glEnd
и Color4f
. Я должен также упомянуть, что я не использую шейдерную программу, я не совсем уверен, что это что-то кардинально меняет здесь. Любая помощь по этому вопросу была бы высоко оценена!
Комментарии:
1. Для выполнения чего-либо способом GL3 требуются шейдеры
Ответ №1:
Я должен также упомянуть, что я не использую шейдерную программу.
Вы не можете использовать glVertexAttribPointer
без шейдера. Эти функции не могут взаимодействовать с конвейером фиксированных функций OpenGL (FFP).
Если вы хотите использовать FFP и по-прежнему использовать объекты буфера, то вам следует использовать соответствующие функции. glVertexPointer
(без «атрибута») и glColorPointer
являются эквивалентами массива для glVertex
и glColor
. Они отлично работают с VAOs.
Итак, единственное, что вам нужно изменить, это ваши два glVertexAttribPointer
вызова be glVertexPointer
и glColorPointer
(и, конечно, соответствующая настройка параметров).
Комментарии:
1. сработало очень красиво! Также полезно знать о glVertexAttribPointer, используемом специально для шейдеров, я, должно быть, пропустил это, когда читал по этому вопросу