2016-10-22 4 views
0

Я надеялся получить некоторую помощь по вопросу OpenGL, касающемуся создания и рендеринга VAO. Цель здесь просто принять это:VAO не передает цвета OpenGL?

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(); 

, который делает красный квадрат в середине окна, и превратить его в ВАО с вершинами, цветов и индексов. Теперь, это то, что я до сих пор, насколько создание ВАО (извините, если это немного долго кода):

//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, &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, &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, &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); 

это делает только competey белый квадрат. Имейте в виду, что я не изменяю ничего о моем цикле рендеринга, за исключением, конечно, избавления от звонков Vertex3f, glBegin/glEnd и Color4f. Я должен также упомянуть, что я не использую шейдерную программу, я не совсем уверен, что это что-то резко меняет. Любая помощь по этому поводу будет высоко оценена!

+1

Выполнение вещей GL3 + требует шейдеров – Alex

ответ

1

Следует также упомянуть, что я не использую программу шейдеров.

Вы не можете использовать glVertexAttribPointerбез шейдера. Эти функции не могут взаимодействовать с конвейером фиксированной функции OpenGL (FFP).

Если вы хотите использовать FFP и все еще использовать объекты буфера, тогда вы должны использовать соответствующие функции. glVertexPointer (нет «Attrib») и glColorPointer являются эквивалентами массива glVertex и glColor. Эти работы с VAO просто прекрасны.

Таким образом, единственное, что вам нужно изменить, это ваши два звонка glVertexPointer и glColorPointer (и, конечно, настройка параметров соответственно).

+0

работал очень красиво! Также хорошо знать, что glVertexAttribPointer используется специально для шейдеров, я, должно быть, пропустил это при чтении по теме – YourNameHere

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