使用layout(location = ...)
在着色器代码中指定顶点属性位置时,我不需要在我的C ++程序中使用glGetAttribLocation
来获取位置。
如果我既没有使用布局限定符在着色器中定义位置,也没有在我的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
来获取它们。
答案 0 :(得分:3)
自动属性分配是任意的;它们遵循实现为其选择的任何算法。
如果您没有分配属性位置,那么您不能假设任何。
答案 1 :(得分:2)
否 - 至少有一个我知道的驱动程序在将属性分配给它们之前将它们排序为字母顺序,如果它们没有明确的layout
指令。此外,程序中未使用的任何属性几乎肯定会被省略,而不会分配位置。
答案 2 :(得分:1)
您可以使用调试器找到分配给您的属性的值:
positionAttribute = glGetAttribLocation(shaderProgram, "position");