【发布时间】:2015-03-20 03:32:33
【问题描述】:
好的,经过一段时间的超时,我正在继续我关于 OpenGL3.2+ 的研究,现在我对如何优化这样的东西感到困惑:
// Verts
glBindBuffer(GL_ARRAY_BUFFER, VertBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * size, verts, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(VERTEX_COORD_ATTRIB);
glVertexAttribPointer(VERTEX_COORD_ATTRIB,3,GL_FLOAT, GL_FALSE, sizeof(float) * floatsPerVertex, 0);
// Textures
glBindBuffer(GL_ARRAY_BUFFER, TexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * texsize, tex, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(TEXTURE_COORD_ATTRIB);
glVertexAttribPointer(TEXTURE_COORD_ATTRIB, 2, GL_FLOAT, GL_FALSE, sizeof(float) * TexCoords2D, 0);
//add light color info
glBindBuffer(GL_ARRAY_BUFFER, ColorBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * colorsize, lightcolor, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(COLOR_ATTRIB);
glVertexAttribPointer(COLOR_ATTRIB, 4, GL_FLOAT, GL_FALSE, sizeof(float) * ColorInfo, 0);
// Draw
glDrawArrays(GL_TRIANGLES, 0, size);
// Clean up
glDisableVertexAttribArray(VERTEX_COORD_ATTRIB);
glDisableVertexAttribArray(TEXTURE_COORD_ATTRIB);
glDisableVertexAttribArray(COLOR_ATTRIB);
假设这是为几个网格完成的,目前每个网格总是像这样被推送、绑定、缓冲和绘制。不用说,这肯定不是有效的方法。
现在在阅读(许多)教程时,我经常看到的一件事是建议使用 VAO 来改进它,现在我难以理解的是 - 每个单独的教程似乎也与索引绘图相关。虽然在使用像 2 个四边形这样极其简单的示例时,这种方法似乎非常好,但我现在想知道应该如何为真正的复杂网格创建索引?还是只是假设这是可用的(由于 .obj 文件或其他原因)。 此外,我对 VAO 是否总是需要索引或是否可以不使用索引感到困惑?如果是这样,那么它是否有意义,因为我读到优化利用知道索引? 你看这里有很多混乱,我意识到这可能又是一个愚蠢的问题:)
但是,我最终想要实现的是,不是像这样推送每个网格,而是在显卡的内存中缓冲每个网格一次,然后从缓冲区中重绘它。 我还不知道 VAO 是否是正确的方法,但我阅读的每个教程似乎都将 VAO 作为下一步。
【问题讨论】: