190 likes | 391 Views
실제 구현을 위한 개념. 왜 DX 가 아니지 ?. 빛의 시뮬레이션을 위한 도구. Backword Ray-tracing. 그림자 part2. 그림자의 역활. 그림자의 방향으로 광원의 위치를 추측 . 광원과 반대 방향이다 . 공간 파악 . 얼마나 지면으로 부터 떨어져 있는가 ?. 그림자의 종류. 투영 텍스쳐 그림자. 조명의 위치에 카메라를 배치 . 조명이 비추는 방향으로 카메라를 바라보게 해서 투영 .
E N D
왜 DX 가 아니지? 빛의 시뮬레이션을 위한 도구. • Backword Ray-tracing.
그림자의 역활 • 그림자의 방향으로 광원의 위치를 추측. 광원과 반대 방향이다. • 공간 파악. 얼마나 지면으로 부터 떨어져 있는가?
투영 텍스쳐 그림자 • 조명의 위치에 카메라를 배치. • 조명이 비추는 방향으로 카메라를 바라보게 해서 투영. • 이렇게 생성된 화면을 그림자로 사용. 물체가 있는 곳에는 바닥의 화면이 가려지기 때문...
투영 텍스쳐 그림자 고려 사항 • 투영된 NDC 좌표계를텍스쳐좌표계로 변환해 주어야 한다.(-1~1), ( 1,1) ( 0,0), (1,1) 광원과 반대 방향이다. • 원래 모델보다 폴리곤 수가 적은 모델을 사용해서 부하를 줄일 수 있다.( 원형 그림자나 평면 투영 그림자도 같은 이점을 가짐 ) • 많은 캐릭터의 그림자를 한번에 그릴 수 있다.한 개의 텍스쳐에 모든 캐릭터의 그림자를 그린 후에,마지막에 지면에 렌더링한다. • 자기 그림자 효과를 처리할 수 없다.
투영 텍스쳐 그림자 생성 원리. • 투영 공간의 폭은 2이며, 텍스쳐좌표계의y 가 반대이다. • 투영공간(x,y)과 텍스쳐 좌표(u,v의 관계)U = +0.5X + 0.5V = -0.5Y + 0.5
깊이 버퍼 그림자 • 광원 방향에서 본 깊이 값을 깊이 버퍼에 저장. 광원과 물체와의 거리를 계산. • 광원의 방향에 카메라를 위치시켜 텍스쳐를 생성.화면에 보이는 모든 물체를 렌더링.카메라와 물체 사이의 거리를 깊이 버퍼에 저장. ( 큰 텍스쳐가 필요 ) • 자기 그림자 처리.( 현실적인 느낌 ) • 부하가 크다. • 그림자 맵의 해상도에 따라 품질이 달라진다.
깊이 버퍼 그림자 처리 단계. • 빛의 방향에 카메라를 위치시키고 투영 변환. • 투영 변환된 값에서 Z값만 런더. 텍스쳐에 저장( 그림자 맵) • 카메라 방향에서 렌더링. • 카메라 방향에서 볼 수 있는 픽셀의 좌표를 라이트뷰 좌표로 변환 • 라이트뷰에서렌더링했을때텍스쳐의몇번째 픽셀에 그려지는지 검사 • 라이트뷰에서렌더링했을때의 깊이 값 조사 • 추출한 픽셀의 깊이 값을 2단계 깊이 텍스쳐에서 추출. • 깊이 값을 비교해서 더 깊으면 그림자 처리 • 그림자 맵이 생성될 때는 z-버퍼링만 필요하다. 즉, 조명 처리, 텍스처 처리 그리고 색상값을 색상 버퍼에 쓰는 기능들은 꺼도 된다.
깊이 버퍼 그림자 생성 원리. • 정점 쉐이더에서 빛의 방향에서 바라본 투영 변환 행렬로모든 정점을 투영 변환 시킨 후, 투영 공간의 좌표 값을픽셀 쉐이더로 넘긴다. • Z 값을 얻기 위해서 z값을 w로 나누어 0~1범위로 얻는다.
그림자 맵 만들기 R32F 포맷
깊이 버퍼 그림자 코드 (VS) 그림자 맵에서깊이값을 가져오는 인덱스가 된다,
쌍선형 보간 (PS) 그림자 맵에는z/w 값이 저장되어 있다. 그림자맵에 저장된 값보디 더 작다면, 그림자이다.