GLSL布局工作方式奇怪

w80xi6nr  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(175)

我的顶点着色器中有两个布局

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是空的(它必须画绿色的三角形)为什么它这么管用?

c90pui9n

c90pui9n1#

使用索引0调用glVertexAttrib是一种特殊的命令:它将导致使用先前设置的所有顶点属性发射一个顶点。

参见OpenGL 2.0规范(其中介绍了glVertexAttrib)第2.7节。“顶点规范”:
设置通用顶点属性零指定一个顶点;四个顶点坐标取自属性零的值。顶点2、顶点3或顶点4命令完全等同于索引为零的相应顶点属性*命令。设置任何其他通用顶点属性会更新该属性的当前值。折点属性零没有当前值

当您这样做时:

glVertexAttrib3f(1, 0, 1, 0); // color
glVertexAttrib3f(0, 0, 0, 0);
glVertexAttrib3f(0, 1, 0, 0);
glVertexAttrib3f(0, 1, 1, 0);

然后,实质上发射三个顶点,其index=1属性的值为(0, 1, 0)

另一方面,当你这样做的时候:

glVertexAttrib3f(0, 0, 1, 0); // color
glVertexAttrib3f(1, 0, 0, 0);
glVertexAttrib3f(1, 1, 0, 0);
glVertexAttrib3f(1, 1, 1, 0);

然后,首先发射one顶点,其所有属性都具有其默认值/零值,然后使用index=1将顶点属性的值设置为有效的(1, 1, 0)(最后一次调用)。只有当你通过调用glVertexAttrib3f(0, ...)“发射”另一个顶点时,才会真正使用它。

因此,底线是:索引为0的顶点属性具有特殊的含义,因为它还将“发射”一个顶点。因此,在为每个顶点设置了所有其他属性之后,glVertexAttrib3f(0, ...)调用应该“始终”是每个顶点的“最后一个”调用。

相关问题