VAO不渲染颜色OpenGL?
我一直希望能够在关于创建和渲染VAO的OpenGL问题上得到一些帮助。这样做的目的很简单,就是利用这个: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();
这使得在窗口中间的红色正方形,与顶点,颜色和指数把它变成一个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, &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
调用。我还应该提到,我没有使用着色器程序,但我不完全确定这是否会在这里发生彻底改变。任何帮助,将不胜感激!
回答
我还应该提到我没有使用着色器程序。
不能使用glVertexAttribPointer
没有的着色器。这些功能不能与OpenGL固定功能管线(FFP)连接。
如果要使用FFP并仍使用缓冲区对象,则应使用相应的功能。 glVertexPointer
(无“Attrib”)和glColorPointer
是与glVertex
和glColor
等同的阵列。这些与VAO合作很好。
所以你唯一需要改变的是你的两个glVertexAttribPointer
调用是glVertexPointer
和glColorPointer
(当然也可以相应地调整参数)。
做事情GL3 +的方式需要着色器 – Alex