Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GLSL结构统一位置返回-1_Java_Opengl_Glsl_Lwjgl - Fatal编程技术网

Java GLSL结构统一位置返回-1

Java GLSL结构统一位置返回-1,java,opengl,glsl,lwjgl,Java,Opengl,Glsl,Lwjgl,我正在尝试创建一些基本的照明系统。我已设置此结构: 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 l

我正在尝试创建一些基本的照明系统。我已设置此结构:

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();
}

查看它是否有效,但灯光的其余统一位置返回为-1。

着色器代码中未使用的统一位置通常会被优化掉。这些制服不被认为是“活动”的,因此其位置为-1。

在我的代码后面,我称之为
Light[]lights=Light[4](light0,light1,light2,light3)然后遍历它们。我只是尝试直接引用一个灯光,并且能够为它获得统一的位置,但是如果我要添加更多灯光,我不想为每个灯光复制粘贴代码。有没有更好的方法对所有的灯光进行操作而不进行优化?@Unknownloner:为什么要将4个变量复制到一个数组中?为什么不将统一设置为数组,然后不进行任何复制?
uniform Light light0;
uniform Light light1;
uniform Light light2;
uniform Light light3;