베개발

[엔진심화] 06. Z-Buffer, Render Queue 본문

대학교 공부

[엔진심화] 06. Z-Buffer, Render Queue

rusal0204 2021. 5. 5. 20:42

목차

  • Z-Buffer
    - 개념 이해
    - 확인해보기
  • Render Queue
    - 개념 이해
    - 확인해보기

■ Z-Buffer

Z버퍼는 픽셀이 얼마나 멀리 있는지 기록하는 버퍼이며, 0~1사이의 값으로 표현된다.

https://ko.wikipedia.org/wiki/Z_%EB%B2%84%ED%8D%BC%EB%A7%81

위 사진에서 볼 수 있듯 가장 가까운 거리는 0으로, 가장 먼 거리는 1로 표현된다.

16비트나 32비트 정밀도를 사용한다. (*정밀도가 높을수록 값을 더 정확하게 설정해줄 수 있다.)

이 Z-Buffer는 오브젝트의 순서에 따라 픽셀을 그릴지, 말지 결정하거나 DOF(Depth Of Field)같은 포스트프로세싱을 하는 데에 쓰인다.

우선 여기서 다뤄볼 것은 픽셀을 그리는지의 여부에 관한 것들이다.

 

화면에 있는 것들의 순서를 매길 때 카메라의 Clipping Planes에 따라서도 영향을 받는다.

https://docs.unity3d.com/Manual/UnderstandingFrustum.html

위와 같이 우리가 화면상에서 볼 수 있는 것은 Far clipping plane과 Near clipping plane 사이이다.

Z-Buffer의 값은 0에서 1까지의 값으로 한정되어있고, 이 안에서 값을 어떻게 나눠줄지, 즉 어느 거리만큼 카메라에 담을지에 대해 Clipping Plane의 Near와 Far 값으로 카메라에서 설정하게 된다.

Near와 Far 사이의 거리가 너무 멀면, 그만큼 그 사이에서 값들을 세부적으로 나눠주기 어려우므로 Z-Fighting이 쉽게 발생하게 된다. 특히 동일한 위치의 평면은 거의 무조건 발생한다.

뒤에 있는 병아리는 z-buffer 상에서 뒤에 있다는 정보가 저장되므로 앞의 병아리에 가려서 보이지 않는다. 

 

만약 z버퍼를 그리지 않게 된다면 물체의 순서를 구분할 수 없게 되기 때문에, 어떤 물체가 먼저 그려지는지는 무작위로 결정된다.

결과적으로 Opaque 오브젝트는 Z버퍼에 의해 그리는 순서와 상관 없이 정상적인 깊이를 렌더링한다.

 

다만 이제 Transparent 오브젝트의 경우 약간 복잡해진다.

포워드 렌더링에서만 가능한 반투명 렌더링은 ZWrite(Z버퍼에 해당 오브젝트를 넣는지의 여부)를 끄고 렌더링하는데, 그 이유는 Zwrite를 켰을 경우 폴리곤 형태로 뒤에 있는 오브젝트를 가려버리기 때문이다. Add, Multiply가 이에 해당한다.

 

즉 정리하자면, 불투명(Opaque)오브젝트는 ZBuffer에 존재하고,(ZWrite On)

반투명 (Transparent)오브젝트는 ZBuffer에 존재하지 않는다. (ZWrite Off)

 

*Alpha Clipping

알파 클리핑은 알파 텍스쳐의 모양대로 Z버퍼에 그려지게 할 수 있는 기능이다.

Transparent 오브젝트의 경우 원래 그림자를 그리면 폴리곤 모양대로 그림자가 그려지게 되지만,

Alpha Clipping을 적용하고 그림자를 그리게 될 경우 알파에 들어간 텍스쳐의 형태대로 그림자가 그려지게 된다.

토끼모양 그림자

또, 반투명한 곳이 잘리고 깔끔하게 보이게 된다.

왼쪽부터 알파클리핑 미적용 / 적용

만약 알파 클리핑을 적용하지 않았을 경우, 아래와 같이 렌더링 순서에 관한 문제가 생기게 되어서 알파 블렌드를 자주 쓴다고 한다.

무작위 순서로 렌더링된다.

 

■ Render Queue

Forward 렌더러의 경우 오브젝트를 화면에 하나씩 그리는데, 따라서 그리는 순서 (Render Queue)가 중요하다.

숫자가 낮을수록 먼저 렌더링이 되는데, 유니티에서 기본으로 설정된 값은 Opaque가 2000, Transparent가 3000이다.

 

참고로 스카이박스는 가장 먼저 그려져야 하는 것이므로 Render Queue에서 사전 설정된 값들 중 가장 낮은 값(1000)으로 설정되어있으며, 다른 오브젝트를 스카이박스보다 먼저 그려지도록 렌더큐를 변경하면 스카이박스에 가려져서 보이지 않게 된다.

물론 렌더큐를 수동으로 설정해줄 수도 있다.

 

머테리얼의 인스펙터 창에서 볼 수 있으며, 사전 설정된 렌더큐는

이렇게 3가지 (지오메트리, 알파테스트, 투명)가 있다.

임의의 값으로 변경하게 될 경우

이렇게 사전 설정된 값에서 얼마나 차이나는지를 보여준다.

 

 

청강문화산업대학교 3학년 1학기 게임그래픽엔진심화 수업 정리입니다.