프로젝션 쉐도우 말입니다..

2D, 3D, 다각형, 픽셀 등 게임의 그래픽 프로그래밍에 관한 포럼입니다.

Moderator: 류광

Locked
jhk8211
Posts: 184
Joined: 2003-12-19 14:04
Location: 우리집

프로젝션 쉐도우 말입니다..

Post by jhk8211 »

Image

프로젝션 쉐도우를 구현했습니다.

전형적인 방식으로 렌더타겟과 뎁스 스텐실 서피스를 따로 만들어서

캐릭터를 두 번 렌더링 하는 방식입니다.

어찌어찌해서 구현은 시켜 놓았으나.. 그 속이 자세히 어떻게 돌아가는지 매우 궁금하군요.

다른 것들은 대충 알아냈습니다.

일단 텍스쳐를 맵핑시키는 코드입니다.

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 매트릭스를 곱해주는 의미가 정확히 뭔지 모르겠습니다.

일단 그림자 텍스쳐 맵핑을 빛이 바라보는 시점으로 매핑을 시켜준다는 뜻인거 같은데..

이런.. 수학적 배경이 별로 없으니 이럴 때 고생하는군요.
주형

.....

Post by 주형 »

현재 뷰 행렬은 카메라가 월드를 보는 뷰 매트릭스 이므로 역행렬을 취하면

월드가 카메라를 바라보는 뷰 매트릭스가 되겠지요. (말이 이상한가. -_-)

그 매트릭스와 matLightView 매트릭스를 곱해주는 의미가 정확히 뭔지 모르겠습니다
카메라 뷰변환행렬에 역행렬을 취한것은 변환을 무효화(이것도 이상한가.. -_-) 한다는 뜻입니다.

거기에 라이트 뷰 매트릭스를 곱하니 라이트 뷰로 변환한다는 뜻이구요.. 결국 텍스쳐 좌표로 생성된

눈좌표계공간 버텍스들은 라이트뷰로 변환되게 됩니다.
jhk8211
Posts: 184
Joined: 2003-12-19 14:04
Location: 우리집

오오..

Post by jhk8211 »

그렇군요~

카메라 View 행렬은 디바이스에 남아있기 때문에 빛이 보는 시점으로

텍스쳐를 매핑 시켜주기 위해서군요..

WVP에서 텍스쳐 좌표를 설정할 때 View 행렬을 LightView 행렬로....

바꿔치기 하는 것이었군요. ^^

너무 어렵게 생각했나봅니다. 답변 감사~

아, 그리고 한 가지 더 궁금한게 있는데,

집에 있는 컴퓨터는 Radeon9000 입니다. 그리고 예전에 썼던 컴퓨터도

지포스 4 MX 였고요,

거기서 저 그림자 방식이 잘 작동하였는데,

여기있는 컴퓨터가 지포스 5600 인데 풀 스크린으로 했을 경우,, 그러니까

해상도가 높아지면 렌더 타겟에 손을 댄 이후로는 화면에 아무것도 그려지지 않습니다.

정확히 말해 렌더 타겟은 상관 없었고요,

뎁스 스텐실 서피스에 문제가 있다는 것을 알았습니다. Z 버퍼를 끄거나,

뎁스 스텐실 서피스를 교체하지 않았을 땐 해상도가 올라가도 문제가 없었습니다.
(물론 제대로 출력은 안되지만... 일단 화면에 나오므로)

재밌는 것은.. 서피스 크기를 확 늘렸더니 해상도가 올라가서도 잘 나온다는 것인데,,

어떤 문제가 있을 수 있는지.. 아주 별 생쇼를 다 했습니다.

코드에도 이상이 없었고요,,(왠만한 다른 그래픽 카드에서 정상적으로 출력이 되므로..)

D3DSpy 까지 써가지고 렌더 스테이트, 텍스쳐 스테이지 스테이트, 샘플러 스테이트, 매트릭스까지

모두 체크해 보았으나 이상이 없었습니다.

다시 윈도우 모드로 바꾸면 잘 나오더군요. -_-;
Locked