2013-01-08 4 views
0

나는 일종의 기본 조명 시스템을 만들려고합니다.GLSL 구조체 균일 위치 반환 -1

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로 반환 : 나는 또한이 시도했다.

답변

2

쉐이더 코드에서 사용되지 않는 유니폼은 종종 최적화됩니다. 이 유니폼은 "활성"으로 간주되지 않으므로 -1의 위치를가집니다.

+0

나중에 내 코드에서 Light [] lights = Light [4] (light0, light1, light2, light3);를 호출 한 다음 반복합니다. 방금 라이트 1 개를 직접 참조하려했으나 균일 한 위치를 얻을 수있었습니다.하지만 라이트를 추가하는 경우 각각의 붙여 넣기 코드를 복사하지 않아도됩니다. 모든 조명으로 작업을 수행하는 더 좋은 방법이 있으며 최적화되지 않았습니까? – Unknownloner

+0

@Unknownloner : 배열에 4 개의 변수를 복사하는 이유는 무엇입니까? 유니폼을 배열로 만들고 복사를하지 않으시겠습니까? –