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