Sam*_*mik 1 opengl vertex-buffer vertex-array-object
我试图了解 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};
Run Code Online (Sandbox Code Playgroud)
我将它们放在不同的顶点缓冲区对象中,并尝试将它们映射到顶点数组对象的索引,以便前 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);
Run Code Online (Sandbox Code Playgroud)
从坐标中可以看出,预期的形状就像一个小屋,矩形上的相邻三角形。然而,我得到的是这个
我是否误解了顶点数组对象的绑定或索引?完整的可编译代码在这里,我使用 GtkGlExt 但 OpenGL 部分是通用的。
小智 5
我认为您对属性是什么犯了概念性错误。
据我了解,您尝试做的是使用 5 个顶点绘制三角形条,其中 3 个来自三角形,其中 2 个来自矩形。
然而,属性是顶点的一部分,即位置和颜色等。顶点属性缓冲区绑定用于所有顶点的一组属性。即您可以将所有顶点的位置放在缓冲区 1 中,并将所有顶点的颜色放在缓冲区 2 中。
您不能将前几个顶点的位置和颜色都放在一个缓冲区中,而将其他顶点的位置和颜色放在另一个缓冲区中,并且仍然在一次调用中绘制它们。
解决方案是将缓冲区(或更准确地说是三角形缓冲区和矩形缓冲区的最后一部分)连接到一个缓冲区中,或者将绘制调用拆分为多个绘制调用。
归档时间: |
|
查看次数: |
1965 次 |
最近记录: |