2

当使用在着色器代码中指定顶点属性位置时,layout(location = ...)我不需要glGetAttribLocation在我的 C++ 程序中使用获取位置。

如果我既没有使用布局限定符在着色器中定义位置,也没有在我的 C++ 程序中获取它们,它们会被自动分配。问题是关于这个自动分配。顺序是否等于着色器代码中的定义顺序?

例如,在第一个着色器代码中,位置是否保证与第二个着色器代码中的位置相同?

// first shader code
#version 330

in vec3 position;
in vec3 normal;
in vec2 texcoord;


// second shader code
#version 330

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 texcoord;

此外,相同的规则是否适用于片段着色器输出?现在我glBindFragDataLocation用来取它们。

4

3 回答 3

3

自动属性分配是任意的;他们遵循实现为他们选择的任何算法。

如果您没有分配属性位置,那么您就不能假设

于 2013-03-05T17:57:59.510 回答
2

不——至少有一个我知道的驱动程序将属性按字母顺序排序,然后再分配位置给它们,如果它们没有明确的layout指令。此外,程序中未使用的任何属性几乎肯定会被忽略并且不会分配位置。

于 2013-03-05T17:44:58.153 回答
1

您可以使用调试器找出分配给您的属性的值:

positionAttribute = glGetAttribLocation(shaderProgram, "position");
于 2013-03-06T18:01:45.087 回答