본문 바로가기
게임 개발/[D3D_Portfolio] DirectX3D 팀 포트폴리오 작업일지

19. 거울 반사 효과 구현

by 헛둘이 2023. 10. 7.

간혹 특정 맵이나 구간은 재질에 따라 물체가 반사되는 등의 효과를 구현해야 한다.

우리 프로젝트도 그런 구간이 존재했고, 심지어 대부분의 맵의 바닥이 그런 식으로 구현되어 있었다.

다른 작업들에 의해 거울 반사 구현이 뒤로 밀리다가 지금에서야 작업하게 되었다.

 

알아보니 반사 효과를 구현하기 위해서는 SSR(Screen Space Reflection) 기법과, 반사 행렬을 이용한 방법이 있었는데,

SSR 기법은 해당 픽셀의 노말 벡터와 Depth Buffer를 계산해서 반사벡터를 만든 후 반사 벡터를 따라서 충돌된 픽셀의 색을 취하는 방법이라고 한다.

언리얼, 유니티 엔진과 같은 상용 엔진에서 사용하는 기법이라고 하는데, 아무래도 레이를 이용하다 보니 무겁지 않을까 생각하여 다른 방식을 고려해보기로 했다.

정확히는 레이 마칭이라는 기법으로 레이트레이싱보다 진보된 기법을 이용한다고 하는데, 이 부분도 프로젝트가 마무리되고 나서 따로 살펴보고 싶은 부분이다.

 

우리 엔진에선 두 번째 방법인 반사 행렬을 이용하여 구현했다.

반사 행렬을 만들기 위해서는 평면이 필요한데, 이 평면을 정의하기 위해서는 노멀벡터와 점이 필요하다.

DirectX11에서는 평면을 추상화한 Plane 클래스 생성자에서 노멀벡터와 위치값(Vector3)를 이용해서 평면을 정의할 수 있다.

이 평면을 이용하면 반사 행렬을 구할 수 있는데, 월드행렬에 이 반사 행렬을 곱해준 후 뷰행렬, 투영행렬을 차례로 곱해주면 원래 그려진 위치에서 평면을 기준으로 반사된 물체를 그려낼 수 있다.

 

유의해야 할 부분은 반사된 물체가 정확히 거울 안에만 그려져야 한다는 것이었다.

이 부분을 구현하기 위해 거울을 스텐실 버퍼로 마스킹한 후, 그 위에 반사된 물체들을 그리는 방식으로 구현했다.

 

 

 

 

 

댓글