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