2015-01-08 2 views
-1

직각 투영을 구성하여 태양의 그림자 맵을 올바르게 보이게하고 싶습니다. 불행히도, 코드는 규칙적인 투시 투영을 사용하여 원하는 결과를 얻지 못하고 있습니다. 투영 행렬을 설정하는 코드는 다음과 같습니다.3D 직교 투영

glViewport (0, 0, (GLsizei)shadowMap.x, (GLsizei)shadowMap.y); 
glMatrixMode (GL_PROJECTION); 
glLoadIdentity(); 

//suns use this 
glOrtho(0, shadowMap.x, 0, shadowMap.y, 0.1,1000.0); 

glMatrixMode (GL_MODELVIEW); 
glLoadIdentity(); 

정확해야합니다. 그러나 빠른 디버그 렌더링 후에 장면이 화면의 작은 부분에 렌더링되고있는 것으로 나타났습니다. 몇 가지 실험을 한 후에 glOth의 shadowMap 값을 변경하면 전체 텍스처를 덮을 수 있지만 실제로 확대되었습니다. 내 원근 투영에서는 가까운 곳과 멀리있는 곳에서 0.1과 1000.0을 사용하고 그 중 하나를 실험했습니다 결과를 변경하지만 원하는 결과를 얻지 못합니다. 내가 올바른 결과를 얻는 유일한 시간은 값이 shadowMap.x와 shadowMap.y로 유지 될 때이지만, 말했듯이 렌더링은 실제로 작습니다.

내가 뭘 잘못하고 있니? 내가 읽은 모든 것은 초기 코드가 정확하다고 말했다.

편집 : 분명히 이것이 섀도우 맵 패스를위한 것인지 확실하지 않았습니다. 일반 패스는 원근감으로 렌더링되며 괜찮습니다.

답변

-1

그림자 매핑은 다중 패스 알고리즘입니다. 당신은 첫 번째 패스 (포인트 1)로 reffering하고 있습니다.

  1. 하는 것이 가능 깊이 텍스쳐 프로젝션 매핑과 카메라 뷰에서 장면을 렌더링 깊이 질감으로 장면 양식 광원보기를 렌더링합니다.

    • 현재의 단편의 XY + 깊이는 투광 좌표로 변환되어 깊이 질감에 저장된 깊이 비교

    • 모두 깊이는 현재의 단편이 점등으로 간주되어야 동일한 (또는 거의 동일한) 경우 , 그렇지 않으면 섀도 잉.

그래서 모든 것이 잘 코드, 매장 깊이 값이 패스에서 깊이 텍스처와 당신에 대해 생각해야한다 2.

한 가지는 당신의 빛을 커버하는 방법을 넓은 지역이다 가리 키도록 진행 (세계 공간에서). Modelview에서로드 인티튜드를 사용하면 빛 단위로 1 세계 단위 x 1 세계 단위 영역을 포함하려고합니다.

  • 우리가 반경 5.0
  • 우리는 256,256 어두워의 깊이 텍스처가와 0, 0, 0에서 영역을 고려하십시오.
  • 우리는 Z를 따라 구형으로 투영하려고합니다.

    glVieport (0,0,256,256); glMatrixMode (GL_PROJECTION); glLoadidentity(); glOrtho (-2.5,2.5, -2.5,2.5, -1000, 1000); glMatrixMode (GL_MODELVIEW); glLoadidentity(); // flip z, 우리는 obove에서 빛을 내 던짐 glRotate (1,0,0,180);

+0

나는 그림자 매핑이 어떻게 작동하는지 알고있다. 이것은 광원에 대한 투영 코드이다. 나는 그 질문에 명확하지 않다는 것을 짐작한다, 새롭게했다. 또한 패스가 잘못 되었기 때문에이 코드가 올바르지 않은 경우, 잘못된 프로젝션에서 장면이 렌더링되므로 기술적으로 그림자 맵에 독립적입니다. – BlueSpud

+0

마지막 참고 사항 업데이트 됨 : – Anonymous

+0

결승전이 정사각형 인 지 모르겠습니다. 왜냐하면 결코 들어 본 적이 없기 때문입니다. 그러나 렌더링에서 지오메트리가 카메라 공간으로 변환됩니다. 직교 투영은 변환을 사용하지 않으므로 모델 뷰에서 카메라 변환을 생략해야합니까? – BlueSpud

-1

라이트 모델 뷰 매트릭스를 설정하는 위치가 표시되지 않습니다. 당신은 아래의 코드를 사용하여 그림자 맵을 렌더링 할 수 있습니다

double* getOrthoMVPmatrix(vector3 position,vector3 lookat, 
          GLdouble left, GLdouble right, 
          GLdouble bottom, GLdouble top, 
          GLdouble nearVal, GLdouble farVal) 
{ 

glPushMatrix(); 

double projection[16]; 
double modelView[16]; 
double *matrix = new double [16]; 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho( left, right, bottom, top, nearVal, farVal) ; 
glMatrixMode(GL_MODELVIEW); 
glEnable(GL_DEPTH_TEST); 
glLoadIdentity(); 
gluLookAt(position.x,position.y,position.z,lookat.x,lookat.y,lookat.z,0,1,0); 

glGetDoublev(GL_MODELVIEW_MATRIX, modelView); 
glGetDoublev(GL_PROJECTION_MATRIX, projection); 


glPopMatrix(); 

matrix = projection*modelView; 

return matrix ; 

} 


void renderShadowMap(void) 
{ 

//"Bind your depth framebuffer" 

glViewport(0,0,"Your SM SIZE","Your SM SIZE"); 
glEnable(GL_CULL_FACE); 
glCullFace(GL_FRONT); 
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

double *MVP = getOrthoMVPmatrix("your light position","your light position" + "your light direction", 
          -"left","right", 
          "bottom","top", 
          "near","far" 
         ) ; 


//"call glUseProgram to bind your shader" 

// set the uniform MVP we made " 

//"Draw your scene " 

glViewport(0,0,"screen width","screen height"); 


} 



귀하의 더블 [16] 배열에 대한 곱셈 연산자를 확인해야합니다. 내 경우에는 매트릭스 클래스를 만들었지 만 당신의 방식대로 해. 실제 장면을 그리기 전에 glCullFace (GL_BACK)를 호출하는 것을 잊어 버리십시오.

+0

문제는 그림자 맵을 렌더링하는 방법이 아니라, 오르토 프로젝션을 만드는 방법입니다. – BlueSpud