将多个缓冲区对象与单个顶点数组对象绑定不起作用
Binding multiple buffer object with a single vertex array object is not working
我正在尝试了解 OpenGL 顶点缓冲区绑定点和顶点数组索引之间的映射。我有一个二维矩形和一个二维三角形
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 部分是通用的。
我认为您在定义什么是属性方面存在概念性错误。
据我了解,您尝试做的是使用 5 个顶点绘制三角形带,其中 3 个来自三角形,2 个来自矩形。
但是,属性是顶点的一部分,即位置和颜色等。顶点属性缓冲区绑定用于所有顶点的一组属性。 IE。您可以将所有顶点的位置放在缓冲区 1 中,将所有顶点的颜色放在缓冲区 2 中。
您不能将前几个顶点的位置和颜色放在一个缓冲区中,将其他顶点的位置和颜色放在另一个缓冲区中,并且仍然在一次调用中绘制它们。
解决方案是将缓冲区(或更准确地说是三角形缓冲区和矩形缓冲区的最后一部分)连接到单个缓冲区或将绘制调用拆分为多个绘制调用。
在着色器代码中声明为 'in' 的任何东西都是属性怎么样?工作定义多于概念定义。
我正在尝试了解 OpenGL 顶点缓冲区绑定点和顶点数组索引之间的映射。我有一个二维矩形和一个二维三角形
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 部分是通用的。
我认为您在定义什么是属性方面存在概念性错误。
据我了解,您尝试做的是使用 5 个顶点绘制三角形带,其中 3 个来自三角形,2 个来自矩形。
但是,属性是顶点的一部分,即位置和颜色等。顶点属性缓冲区绑定用于所有顶点的一组属性。 IE。您可以将所有顶点的位置放在缓冲区 1 中,将所有顶点的颜色放在缓冲区 2 中。
您不能将前几个顶点的位置和颜色放在一个缓冲区中,将其他顶点的位置和颜色放在另一个缓冲区中,并且仍然在一次调用中绘制它们。
解决方案是将缓冲区(或更准确地说是三角形缓冲区和矩形缓冲区的最后一部分)连接到单个缓冲区或将绘制调用拆分为多个绘制调用。
在着色器代码中声明为 'in' 的任何东西都是属性怎么样?工作定义多于概念定义。