我的顶点着色器中有两个布局
layout (location = 1) in vec3 aColor;
layout (location = 0) in vec3 aPos;
我通过函数glVertex Attrib3f()设置它们;
glVertexAttrib3f(1, 0, 1, 0); // color
glBegin(GL_TRIANGLES); // vertexes
glVertexAttrib3f(0, 0, 0, 0);
glVertexAttrib3f(0, 1, 0, 0);
glVertexAttrib3f(0, 1, 1, 0);
glEnd();
在这种情况下,一切都很好,我把我的绿色三角形放在一个窗口里。但如果我交换APOS布局和aColor(将1设置为APOS,将0设置为aColor)
layout (location = 0) in vec3 aColor;
layout (location = 1) in vec3 aPos;
也别忘了在我的CPP文件中交换它们
glVertexAttrib3f(0, 0, 1, 0); // color
glBegin(GL_TRIANGLES); // vertexes
glVertexAttrib3f(1, 0, 0, 0);
glVertexAttrib3f(1, 1, 0, 0);
glVertexAttrib3f(1, 1, 1, 0);
glEnd();
什么都不管用,我的Windows是空的(它必须画绿色的三角形)为什么它这么管用?
1条答案
按热度按时间c90pui9n1#
使用索引
0
调用glVertexAttrib
是一种特殊的命令:它将导致使用先前设置的所有顶点属性发射一个顶点。参见OpenGL 2.0规范(其中介绍了
glVertexAttrib
)第2.7节。“顶点规范”:设置通用顶点属性零指定一个顶点;四个顶点坐标取自属性零的值。顶点2、顶点3或顶点4命令完全等同于索引为零的相应顶点属性*命令。设置任何其他通用顶点属性会更新该属性的当前值。折点属性零没有当前值
当您这样做时:
然后,实质上发射三个顶点,其
index=1
属性的值为(0, 1, 0)
。另一方面,当你这样做的时候:
然后,首先发射one顶点,其所有属性都具有其默认值/零值,然后使用
index=1
将顶点属性的值设置为有效的(1, 1, 0)
(最后一次调用)。只有当你通过调用glVertexAttrib3f(0, ...)
“发射”另一个顶点时,才会真正使用它。因此,底线是:索引为
0
的顶点属性具有特殊的含义,因为它还将“发射”一个顶点。因此,在为每个顶点设置了所有其他属性之后,glVertexAttrib3f(0, ...)
调用应该“始终”是每个顶点的“最后一个”调用。