2014-08-31 3 views
1

저는 LWJGL 게임을위한 쉐이더를 사용하여 기본적인 정지 점 광원을 만들려고했지만 카메라의 위치가 변환되고 회전 될 때 빛이 움직이는 것처럼 보입니다. 이 쉐이더는 OpenGL 4.3 가이드에서 약간 수정되었으므로 의도 한대로 작동하지 않는 이유가 확실하지 않습니다. 아무도 왜 이러한 쉐이더가 의도 한대로 작동하지 않고 내가 작동하도록 할 수 있는지 설명 할 수 있습니까?카메라로 움직이는 GLSL 포인트 라이트 쉐이더

버텍스 쉐이더 :

varying vec3 color, normal; 
varying vec4 vertexPos; 

void main() { 
    color = vec3(0.4); 
    normal = normalize(gl_NormalMatrix * gl_Normal); 
    vertexPos = gl_ModelViewMatrix * gl_Vertex; 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

조각 셰이더 : 사람이 관심

varying vec3 color, normal; 
varying vec4 vertexPos; 

void main() { 
    vec3 lightPos = vec3(4.0); 
    vec3 lightColor = vec3(0.75); 
    vec3 lightDir = lightPos - vertexPos.xyz; 
    float lightDist = length(lightDir); 
    float attenuation = 1.0/(3.0 + 0.007 * lightDist + 0.000008 * lightDist * lightDist); 
    float diffuse = max(0.0, dot(normal, lightDir)); 
    vec3 ambient = vec3(0.4, 0.4, 0.4); 
    vec3 finalColor = color * (ambient + lightColor * diffuse * attenuation); 
    gl_FragColor = vec4(finalColor, 1.0); 
} 
+0

누구든지 관심이 있다면 해결책을 찾지 못했습니다. gl_NormalMatrix 및 gl_ModelViewMatrix에 대한 호출을 제거하면 문제가 해결되었습니다. – user29112

+0

답변으로 게시하고 수락해야합니다. – Dawnkeeper

답변

2

경우에, 나는 해결책을 찾는 끝났다. gl_NormalMatrix 및 gl_ModelViewMatrix에 대한 호출을 제거하면 문제가 해결되었습니다.

0

여기서 중요한 값인 lightPos는 화면 공간에서 표현한 vertexPos의 함수로 설정되었습니다 (원래의 월드 공간 형식에 modelView가 곱해 졌기 때문에 발생했습니다). 화면 공간은 카메라와 함께 유지되지만 3D 세계에서는 그렇지 않습니다. 따라서 [4.0, 4.0, 4.0]과 같이 세계 공간의 절대 지점과 관련하여 움직이지 않는 광원을 얻으려면, 발견 한대로 그 공간에 물건의 점을 남길 수 있습니다.

그러나 modelview를 없애는 것은 좋은 생각이 아닙니다. 모델 행렬의 전체 점은 속한 곳에 개체를 배치하는 것이므로 (대신 모델 행렬 만 변경하여 꼭지점 배열을 다시 사용할 수 있기 때문에) 모든 단일 모양의 꼭지점 위치를 처음부터 지정하는 방법으로 부하를 가하는 방법).

더 좋은 방법은 vertexPos와 lightPos에서 modelView 곱하기를 수행하는 것입니다. 이 방법으로 원래는 lightPos를 월드 공간의 수량으로 취급하지만 화면 공간에서 비교를 수행합니다. 법선으로부터 빛의 강도를 얻는 수학은 어느 공간에서도 똑같이 작동 할 것이고 당신은 정확한 광원을 얻을 것입니다.