VAO 不渲染颜色 OpenGL?
VAO not rendering colors 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();
它在 window 的中间呈现一个红色方块,并将其转换为具有顶点、颜色和索引的 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
。在浏览了关于这个主题的类似问题之后,我仍然没有看到我遗漏了什么 and/or 没有做对,因为当我用这些简单的线条渲染它时:
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, verts_amt, GL_UNSIGNED_INT, NULL);
它只呈现一个有竞争力的白色方块。请记住,除了删除 Vertex3f
、glBegin/glEnd
和 Color4f
调用之外,我没有更改任何有关渲染循环的其他内容。我还应该提到我没有使用着色器程序,我不完全确定这是否会彻底改变这里。如有任何帮助,我们将不胜感激!
I should also mention that I'm not using a shader program.
如果没有 着色器,您将无法使用 glVertexAttribPointer
。这些功能无法与 OpenGL 固定功能管道 (FFP) 连接。
如果你想使用FFP并且仍然使用缓冲区对象,那么你应该使用适当的函数。 glVertexPointer
(没有 "Attrib")和 glColorPointer
是等价于 glVertex
和 glColor
的数组。这些与 VAO 一起工作得很好。
所以您唯一需要更改的是将两个 glVertexAttribPointer
调用设为 glVertexPointer
和 glColorPointer
(当然还要相应地调整参数)。
我希望在有关 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();
它在 window 的中间呈现一个红色方块,并将其转换为具有顶点、颜色和索引的 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
。在浏览了关于这个主题的类似问题之后,我仍然没有看到我遗漏了什么 and/or 没有做对,因为当我用这些简单的线条渲染它时:
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, verts_amt, GL_UNSIGNED_INT, NULL);
它只呈现一个有竞争力的白色方块。请记住,除了删除 Vertex3f
、glBegin/glEnd
和 Color4f
调用之外,我没有更改任何有关渲染循环的其他内容。我还应该提到我没有使用着色器程序,我不完全确定这是否会彻底改变这里。如有任何帮助,我们将不胜感激!
I should also mention that I'm not using a shader program.
如果没有 着色器,您将无法使用 glVertexAttribPointer
。这些功能无法与 OpenGL 固定功能管道 (FFP) 连接。
如果你想使用FFP并且仍然使用缓冲区对象,那么你应该使用适当的函数。 glVertexPointer
(没有 "Attrib")和 glColorPointer
是等价于 glVertex
和 glColor
的数组。这些与 VAO 一起工作得很好。
所以您唯一需要更改的是将两个 glVertexAttribPointer
调用设为 glVertexPointer
和 glColorPointer
(当然还要相应地调整参数)。