我试图了解OpenGL顶点缓冲区绑定点和顶点数组索引之间的映射。我有一个2D矩形和一个2D三角形
const GLfloat rect[] = {
-0.5f, 0.5f,
0.5f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f};
const GLfloat tri[] = {
0.0f, 1.0f,
0.5f, 0.5f,
-0.5f, 0.5f};
我将它们放在不同的顶点缓冲区对象中,并尝试将它们映射到顶点数组对象的索引,以便前3个属性来自三角形,其后2个属性来自矩形的后2个点。然后我将它们绘制为三角带。
GLuint vbo[2];
glGenBuffers(2, vbo);
GLuint varr;
glGenVertexArrays(1, &varr);
glBindVertexArray(varr);
// draw triangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(tri), tri, 0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
// draw rectangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(rect), rect, 0);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
glEnableVertexAttribArray(3);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
glDeleteVertexArrays(1, &varr);
glDeleteBuffers(2, vbo);
从坐标中可以看到,预期的形状就像小屋,矩形上的相邻三角形。但是,我得到的是
我是否误解了顶点数组对象的绑定或索引?完整的可编译代码在这里,我使用GtkGlExt,但是OpenGL部分是通用的。
我认为您在关于属性是什么方面犯了概念错误。
据我了解,您尝试执行的操作是使用5个顶点绘制一个三角形带,其中3个来自三角形,而2个来自矩形。
但是,属性是顶点的一部分,即位置和颜色等。顶点属性缓冲区绑定用于所有顶点的一组属性。即您可以将所有顶点的位置放在缓冲区1中,并将所有顶点的颜色放在缓冲区2中。
您不能将前几个顶点的位置和颜色都放置在一个缓冲区中,而将其他顶点的位置和颜色都放置在另一个缓冲区中,而仍无法在一次调用中绘制它们。
解决方案是将缓冲区(或更准确地说是三角形缓冲区和矩形缓冲区的最后一部分)连接到单个缓冲区中,或者将draw调用拆分为多个draw调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句