프로젝션 쉐도우를 구현했습니다.
전형적인 방식으로 렌더타겟과 뎁스 스텐실 서피스를 따로 만들어서
캐릭터를 두 번 렌더링 하는 방식입니다.
어찌어찌해서 구현은 시켜 놓았으나.. 그 속이 자세히 어떻게 돌아가는지 매우 궁금하군요.
다른 것들은 대충 알아냈습니다.
일단 텍스쳐를 맵핑시키는 코드입니다.
Code: Select all
D3DXMATRIX matScale, matTrans, matTemp;
D3DXMatrixIdentity( &matTrans );
// 텍스쳐 맵핑 U, V 생성...
// 먼저 현재 뷰 매트릭스를 얻어온다.
m_pd3dDevice->GetTransform( D3DTS_VIEW, &matTemp );
// 뷰 매트릭스를 역행렬로~
D3DXMatrixInverse( &matTrans, NULL, &matTemp );
// 역행렬의 현재 뷰매트릭스를 라이트 뷰매트릭스와 곱해준다.
D3DXMatrixMultiply( &matTrans, &matTrans, &m_matLightView );
D3DXMatrixScaling( &matTemp, 1.0f/100.0f, -1.0f/100.0f, 1.0f );
D3DXMatrixMultiply( &matTrans, &matTrans, &matTemp );
D3DXMatrixTranslation( &matTemp, 0.5f, 0.5f, 0.0f );
D3DXMatrixMultiply( &matTrans, &matTrans, &matTemp );
// 텍스쳐 좌표 셋팅.
m_pd3dDevice->SetTransform( D3DTS_TEXTURE0, &matTrans );
일단 D3DTSS_TCI_CAMERASPACEPOSITION 옵션을 사용해서
U,V 좌표를 DX가 자동으로 생성하는 방식이죠.
제가 궁금한 것은 역행렬입니다.
현재 뷰의 역행렬을 얻어와서 matLightView 와 곱해줍니다.
matLightView 는 라이트 시점에서 본 뷰 매트릭스입니다. 그림자 텍스쳐에서 그림자 렌더링할 때
사용한 매트릭스죠.
현재 뷰 행렬은 카메라가 월드를 보는 뷰 매트릭스 이므로 역행렬을 취하면
월드가 카메라를 바라보는 뷰 매트릭스가 되겠지요. (말이 이상한가. -_-)
그 매트릭스와 matLightView 매트릭스를 곱해주는 의미가 정확히 뭔지 모르겠습니다.
일단 그림자 텍스쳐 맵핑을 빛이 바라보는 시점으로 매핑을 시켜준다는 뜻인거 같은데..
이런.. 수학적 배경이 별로 없으니 이럴 때 고생하는군요.