2014-04-28 3 views
0

나는 하이트 맵에서 생성 된 맵을 포함하는 씬을 가지고있다. 나는지도 지오메트리가 원점을 가로 지르도록지도가 위 또는 아래로 움직이는 X 및 Y 축 주위로이지도를 움직일 수 있습니다. 지도 위에 놓여있는 하나의 빛이 있는데, 항상 x와 y 좌표에서 기하학 높이보다 5 단위 위에 위치합니다.조명 계산으로 인해 색상이 검은 색으로 점프하는 이유는 무엇입니까?

카메라가 장면의 원점 근처에 있으면 모든 조명이 정상적으로 작동합니다. 그러나 그로부터 멀어 질수록 더 많은 삼각형이 먼저 밝은 흰색으로 빠르게 뛰어 오르고 그 후에는 거의 즉시 검정색이됩니다. 나는 이것을 일으키는 원인을 알아낼 수 없었다.

scene graph overview

  • 컨테이너 인스턴스는 OpenGL 상태
  • 쉐이더 노드 아래 셰이더 쌍 활성화를 변경하지 않는다 : 여기서

    는 장면 그래프의 구조의 개요이다.
    • 고정 기능 파이프 라인을 사용할 때도 문제가 있습니다.
  • 장면은 번역 내가 문제가 현장의 건설에있다 꽤 확신 씬 그래프

을 렌더링하기 전에 회전,하지만 난 완전히 확실하지 않다된다.

다음은 효과의 일부 스크린 샷입니다. 먼저, 광이 카메라에 가까운 한, 상기 카메라가 먼 거리 장면 원점으로부터의 위치 :

up close

주 광은 적색 동그라미로 표시 구형으로 도시되어있다. 둘째, 빛이 카메라에서 멀리 하나 :

far away

은 또한 참조를 위해 법선을 그리기입니다. 이 그림에서 볼 수있는 광선은 카메라에 대한 광원의 위치에 관계없이 항상 나타납니다.

여기 내 셰이더가 있습니다.

버텍스 쉐이더 :

varying vec3 normal; 
varying vec3 position; 

void main(void) 
{ 
    gl_Position = ftransform(); 
    gl_TexCoord[0] = gl_MultiTexCoord0; 

    normal = gl_NormalMatrix * gl_Normal; 
    position = (gl_ModelViewMatrix * gl_Vertex).xyz; 
} 

조각 쉐이더 :

varying vec3 normal; 
varying vec3 position; 

vec4 lightSource(vec3 norm, vec3 view, gl_LightSourceParameters light) 
{ 
    vec3 lightVector = normalize(light.position.xyz - view); 
    vec3 reflection = normalize(lightVector - view.xyz); 

    float diffuseFactor = max(0, dot(norm, lightVector)); 
    float specularDot = max(0, dot(norm, reflection)); 

    float specularFactor = pow(specularDot, gl_FrontMaterial.shininess); 

    return 
     gl_FrontMaterial.ambient * light.ambient + 
     gl_FrontMaterial.diffuse * light.diffuse * diffuseFactor + 
     gl_FrontMaterial.specular * light.specular * specularFactor; 
} 

vec4 lighting() 
{ 
    // normal might be damaged by linear interpolation. 
    vec3 norm = normalize(normal); 

    return 
     gl_FrontMaterial.emission + 
     gl_FrontMaterial.ambient * gl_LightModel.ambient + 
     lightSource(norm, position, gl_LightSource[0]); 
} 

void main() 
{ 
    gl_FragColor = lighting(); 
} 

답변

1

문제에 대한 해결책 나는 그들이 야지로가 ShaderMaker에서 제대로 작동하기 때문에 그들이 일을 확신한다 내가 modelView 매트릭스에 glFrustrum()을 적용했다는 것입니다. 대신 glFrustrum을 호출하기 전에 glMatrixMode를 투영 행렬로 설정하면 장면이 올바르게 렌더링됩니다.

관련 문제