我正在尝试创建某种基本的照明系统。我有这个结构设置:
struct Light
{
vec3 position;
vec4 diffuse;
vec4 ambient;
bool enabled;
};
然后我定义了4个禁用灯:
uniform Light light0 = Light(vec3(0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), false);
uniform Light light1 = Light(vec3(0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), false);
uniform Light light2 = Light(vec3(0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), false);
uniform Light light3 = Light(vec3(0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), vec4(0.0, 0.0, 0.0, 0.0), false);
在我的程序中,我正在尝试获取统一的位置,以便我可以更改灯光,因此我使用此代码。
int[][] lightLocs = new int[MAX_LIGHTS][4]; //Position, Diffuse, Ambient, Enabled
for(int i = 0; i < MAX_LIGHTS; i++) { //MAX_LIGHTS is set to 4
lightLocs[i][0] = GL20.glGetUniformLocation(shaderProgram, "light"+i+".position");
lightLocs[i][1] = GL20.glGetUniformLocation(shaderProgram, "light"+i+".diffuse");
lightLocs[i][2] = GL20.glGetUniformLocation(shaderProgram, "light"+i+".ambient");
lightLocs[i][3] = GL20.glGetUniformLocation(shaderProgram, "light"+i+".enabled");
//Print locations just for bug testing
for(int j = 0; j < 4; j++) {
System.out.print(lightLocs[i][j] + ", ");
}
System.out.println();
}
但是我得到了一些奇怪的结果。前3个灯(0-2)的所有4个位置都返回-1。 light3上的位置位置也返回-1,但最后3个值返回4,5和6. 4,5和6有意义,因为我在顶点着色器中的灯前定义了4个制服,但为什么我其他位置得-1?我也试过这个:
uniform Light light0;
uniform Light light1;
uniform Light light2;
uniform Light light3;
看它是否会起作用,但灯的其余均匀位置返回-1。
答案 0 :(得分:2)
着色器代码中未使用的制服通常会进行优化。这些制服不被视为“活跃”,因此位置为-1。