2013-04-07 8 views
0

현재 iOS의 Open GL ES 2.0에서 스포트 라이트를 구현 중입니다. 모든 조명 계산은 월드 공간에서 수행됩니다 (즉, 세계 공간 좌표를 쉐이더에 전달합니다).OpenGL ES 2.0 거리가 멀어 질수록 iOS 스포트 라이트가 올바르지 않습니다.

나는 현장에서 수평으로 바닥 메쉬 (아주 잘 붙인 것)를 놓았고, 광원은 (0,250,0) 즉 곧게 뻗었습니다. 내 쉐이더에서는 라이트를 똑바로 가리 키도록 코드를 하드 코딩합니다 (0, -1,0). 이 상황에서는 스포트 라이트 콘이 작동하지 않습니다. 그러나, 어떤 지점에서 플로어 위치를 위로 올리면 (y 축에서 빛에 가까워짐) 스포트 라이트가 나타납니다. 또한, 나타나는 바로 전에 콘의 이상한 '미러 이미지'윤곽이 바닥에 나타나고 특정 임계 값에 약간의 명백한 렌더링 버그가 있습니다 (아래 4 번째 이미지)

다음 앨범의 스크린 샷을 참조하십시오. 각 이미지를 빛에 더 가깝게 배치하는 플로어로 배열합니다. 마지막 이미지가 올바르게 또한

http://imgur.com/a/cKOll

작업을 보여줍니다 -이 화면은 아이 패드 미니에 찍은를하지만, 엑스 코드 iOS 시뮬레이터에 완벽하게 작동합니다!

또한 '닫기'범위에서 모든 기본 퐁 계산이 예상대로 작동합니다.

문제의 원인에 대한 의견이 있으십니까?

// Fragment shader 
precision highp float; 

uniform mediump vec4 u_mat_diffuse; 
uniform mediump vec4 u_mat_ambient; 
uniform mediump float u_mat_specular; 
uniform mediump float u_mat_shininess; 
uniform mediump vec3 u_light_color; 
uniform mediump float u_light_intensity; 
uniform mediump vec3 u_light_spot_dir; 
uniform mediump float u_light_spot_cutoff; 
uniform mediump vec3 u_light_pos; 
uniform mediump vec3 u_camera_eye; 


varying mediump vec3 v_light_dir; 
varying mediump vec3 v_normal; 
varying mediump vec3 v_pos; 


void main(void) 
{ 
    //normalize all first - v-pos is the vertex world position 
    //all uniforms are in world position 
    mediump vec3 E = normalize(u_camera_eye - v_pos); 
    mediump vec3 L = normalize(u_light_pos - v_pos); 

    mediump vec3 N = normalize(v_normal); 

    mediump vec3 light_direction = vec3(0.0, -1.0, 0.0); //light direction 
    mediump vec3 D = normalize(light_direction); 


    highp vec4 finalColor = vec4(0.0, 0.0, 0.0, 1.0); 

    //simple lambert 
    highp float ndotl = max(dot(N, L), 0.0); 
    highp vec3 DiffuseColor = vec3(1.0, 1.0, 1.0) * ndotl; 


    if (dot(-L, D) > 0.9) 
    { 
     finalColor += vec4(DiffuseColor, 1.0) * vec4(1.0, 0.0, 0.0, 1.0);   
    } 

    gl_FragColor = finalColor ; 

} 

편집 :

여기 내 조각 쉐이더의 I는 고정 값을 수 finalColor을 설정하면 다음 작동 (즉 확산 용어를 사용하지 않음)!

는 대답은 관련 벡터를 만드는 것이었다과 쉐이더에있는 모든 높은 정밀도 (highp를) 행렬 : 그래서 확산 용어가 해결

를 계산하는 방식에 문제가있다.

답변

0

대답은 쉐이더에서 관련 벡터와 행렬을 모두 고정밀 도로 (highp) 만들려는 것이 었습니다.