我正在尝试理解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);
从坐标中可以看出,预期的形状就像一个小屋,相邻的三角形在矩形上。但是,我得到的是这个
我是否误解了顶点数组对象的绑定或索引?完全可编译的代码是here,我使用GtkGlExt,但OpenGL部分是通用的。
答案 0 :(得分:4)
我认为你在关于属性的概念上犯了一个概念错误。
据我所知,您尝试做的是使用5个顶点绘制三角形条带,其中3个来自三角形,其中2个来自矩形。
然而,属性是顶点的一部分,即位置和颜色等。顶点属性缓冲区绑定用于所有顶点的一组属性。即您可以将所有顶点的位置放在缓冲区1中,将所有顶点的颜色放在缓冲区2中。
您不能将前几个顶点的位置和颜色放在一个缓冲区中,将其他顶点的位置和颜色放在另一个缓冲区中,并且仍然可以在一次调用中绘制它们。
解决方案是将缓冲区(或更准确地说是三角形缓冲区和矩形缓冲区的最后部分)连接到单个缓冲区中,或者将绘制调用拆分为多个绘制调用。
答案 1 :(得分:0)
在'中声明为'在着色器代码中是一个属性?一个工作定义而不是概念定义。