Shadow Mapping

반응형

Depth Shadow(깊이 그림자), Shadow Maps(그림자 맵),
Depth Bufffer Shadow(깊이버퍼 그림자) 등의 여러가지 이름으로 불린다.

이 기법의 핵심은 광원으로부터 물체까지의 거리정보를 저장해서 사용한다는 것이다.

1. depth 찍기
// 조명위치로 시선 이동
float3 vLook = float3(0,0,0);
float3 vEye = lightPos.xyz;
float3 vUp = float3(0,0,1);

// 조명의 시야벡터들 만들고 뷰 공간으로 변환
float4x4 lightMat = GenViewMatrix(vLook, vEye, vUp);
Pos -= lightPos; 
Out.Pos = mul(Pos, lightMat);

// 조명의 투영변환행렬.
Out.Pos = mul(Out.Pos, proj_matrix);

대충 요렇게 하면 우선 깊이값은 얻어올 수 있다.


2. 모델의 diffuse, specular 적용해서 찍기


3. 미리 만들어둔 그림자맵과 렌더링하려는 픽셀의
   광원까지의 거리를 비교한다.

   렌더링하려는 픽셀의 광원까지의 거리값이
   그림자맵보다 크다면 그 부분은 그림자가 된다.

float shadow = (depth < shadowMap + shadowBias);


float shadow = (depth < shadowMap + shadowBias);

4. 그림자를 바닥에 붙여준다.



보면 알겠지만 재기스 현상이 좀 심하다.
이는 그냥 그림자맵 텍스처 해상도를 올려 줄 수 밖에...



참고 링크들...
행렬 정리
- http://mgun.tistory.com/1363

Allosha님의 블로그,  깊이버퍼 그림자 기법, 문제점
- http://allosha.tistory.com/24

opengl tutorial
- http://www.paulsprojects.net/tutorials/smt/smt.html



  - 언렬 머티리얼 에디터 쓰다가 렌더몽키 처음 쓸때는 많이 불편했는데
    그래도 난 렌더몽키가 더 재미있는듯....
    

'RenderMonkey' 카테고리의 다른 글

fresnel  (0) 2013.10.22
normal mapping (법선 매핑)  (2) 2013.02.07
기본적인 반사 벡터  (0) 2013.02.02
lambert  (3) 2013.01.31
흐음...렌더몽키라..  (0) 2013.01.29
TAGS.

Comments