【问题标题】:VAO not rendering colors OpenGL?VAO不渲染颜色OpenGL?
【发布时间】:2016-10-22 03:01:49
【问题描述】:

我希望在有关 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);

它只呈现一个有竞争力的白色方块。请记住,我不会改变我的渲染循环的任何其他内容,当然除了摆脱Vertex3f、glBegin/glEnd 和Color4f 调用。我还应该提到我没有使用着色器程序,我不完全确定这是否会彻底改变这里的任何东西。对此的任何帮助将不胜感激!

【问题讨论】:

  • 以 GL3+ 方式做事需要着色器

标签: opengl vao


【解决方案1】:

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

你不能在没有着色器的情况下使用glVertexAttribPointer 。这些函数无法与 OpenGL 固定函数管道 (FFP) 接口。

如果你想使用 FFP 并且仍然使用缓冲区对象,那么你应该使用适当的函数。 glVertexPointer(没有“属性”)和glColorPointer 是glVertex 和glColor 的数组等价物。这些可以很好地与 VAO 一起使用。

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

【讨论】:

  • 工作得非常好!了解专门用于着色器的 glVertexAttribPointer 也很好,我在阅读该主题时一定错过了这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2023-04-09
相关资源
最近更新 更多