본문 바로가기
DirectX 12/Camera & Lighting

[DirectX12 - Camera & Lighting] Chapter 05. Skybox

by song.ift 2023. 6. 23.

GitHub : https://github.com/developeSHG/DirectX12-Camera_Lighting/commits/05.Skybox

 

GitHub - developeSHG/DirectX12-Camera_Lighting: DirectX12 - Camera & Lighting

DirectX12 - Camera & Lighting. Contribute to developeSHG/DirectX12-Camera_Lighting development by creating an account on GitHub.

github.com

 

결과물

 

 


 

 

 

Skybox는 월드좌표가 필요없다.
왜냐하면 플레이어가 움직여서 skybox 밖으로 벗어나면 안되기때문이다.
그럼 월드 스페이스의 srt에서 s와t를 제외한 r(rotation)은 들어가야한다.
플레이어의 시선 방향에 따라 skybox는 각각 따로 움직여야 하기 때문이다.
sykbox는 월드좌표의 t를 제외한 카메라의 원점에 계속 같이 있어야하기하기 때문에 자신의 로컬좌표에서 바로 뷰 행렬 연산은 한다.


예시) 만약 절두체가 스카이박스보다 더 크다고 가정하고, 스카이박스와 절두체 사이에 물체가 있으면 어떻게 될까?
생각해본다면 물체는 당연히 스카이박스보다 깊이버퍼가 크니 안그려줘야 정상이지만, 렌더링상으론 보여줘야한다.
그래서 z값(깊이버퍼)를 절두체의 near, far의 far(1값)에 무조건 맞추기 위해
버텍스 쉐이더에서 깊이버퍼를 w로 지정해준다.
(왜냐하면 레스터라이즈 단계에서 x, y, z를 w(1)로 나누는데, z를 w로 넣으면 항상 1이기 때문에)
(나누는 이유는 3D화면을 2D화면으로 투영하기 위한 깊이 버퍼를 담아뒀다가 나눠주는 과정이였음)

또한 스카이박스는 컬링 모드를 기본 시계방향 세팅이 아닌 반시계 방향으로 한다.
왜냐하면 모든 물체는 당연히 물체 안에서가 아닌 밖에서 보고있지만, 스카이박스는 안에서 있기때문에
버텍스의 인덱스 방향이 반대로 있기 때문이다. 그래서 컬링이 되는걸 방지하기위해 반시계방향으로 한다.

쉐이더에서 했지만, 그냥 C++로 해도 괜찮다.

댓글