VAO не отображает цвета в OpenGL?

#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, используемом специально для шейдеров, я, должно быть, пропустил это, когда читал по этому вопросу