VAO不渲染颜色OpenGL?

 2016-10-22  87 views 
 
 
0

我一直希望能够在关于创建和渲染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白色广场。请记住,我不会改变我的渲染循环的其他任何内容,当然,除掉Vertex3fglBegin/glEndColor4f调用。我还应该提到,我没有使用着色器程序,但我不完全确定这是否会在这里发生彻底改变。任何帮助,将不胜感激!

+1

做事情GL3 +的方式需要着色器 – Alex

回答

1

我还应该提到我没有使用着色器程序。

不能使用glVertexAttribPointer没有的着色器。这些功能不能与OpenGL固定功能管线(FFP)连接。

如果要使用FFP并仍使用缓冲区对象,则应使用相应的功能。 glVertexPointer(无“Attrib”)和glColorPointer是与glVertexglColor等同的阵列。这些与VAO合作很好。

所以你唯一需要改变的是你的两个glVertexAttribPointer调用是glVertexPointerglColorPointer(当然也可以相应地调整参数)。

posted on 2022-10-25 15:07  zxddesk  阅读(36)  评论(0)    收藏  举报

导航