OpenGL 공식 사이트를 통해 Depth Buffer와 Stencil Buffer에 대해 알아보자.
Ray tracing의 경우 연산량이 많지만 눈으로 부터 광선이 역추적하여 픽셀에 렌더링되기 때문에 멀리있는 오브젝트가 그려지지 않는다. (참고로 Ray tracing에서도 Depth Buffer가 사용될 수 있다.)
하지만 Rasterization에서 Depth Buffer가 없다면 어떻게 될까?
위 그림처럼 뒤에 있어서 일부분이 가려져야할 텍스처가 앞으로 나온 것처럼 보인다.
래스터로 투영된 객체는 앞 뒤 구분이 없기 때문에 나중에 렌더링된 픽셀이 표시되는 것이다.
Depth Buffer
대신 픽셀마다 Z값을 저장하면 저장된 Z값과 현재 Z값을 비교하여 한 픽셀의 Depth Buffer에서 현재 Z값이 더 작은(더 가까이 있는) 경우에만 덮어 씌우면 결국 더 가까이 있는 객체가 보일 것이다. 이것을 Depth Testing이라고 한다. Depth Testing에 실패한 경우(Depth Fail)는 현재 객체 앞에 다른 객체가 존재하여 렌더링 되지 않게 된다는 의미이다.
즉 Depth Buffer는 래스터화된 픽셀들이 가지는 일종의 Z값인 것이다.
OpenGL에서 Depth Buffer는 정규화되어 0~1.0f 값을 가지는데 1.0f 위치에는 먼 클리핑 평면(Far Clipping Plane)이 위치하고 있어서 이를 벗어나면 보이지 않게 된다. 그래서 면의 픽셀의 z값을 0~1.0f 값 사이를 유지하도록 해야한다. 이렇게 Depth Testing을 거치면 위 사진처럼 정상적으로 나타난다.
Stencil Buffer
Stencil Buffer는 오브젝트의 마스킹 역할을 한다.
OpenGL에서는 보여줄 영역을 비트 형태로 버퍼에 저장한다.
뒤에 있는 오브젝트가 앞으로 나와야 하는 경우는 어떤게 있을까?
위 렌더링 이미지에서 제작자가 보여주고자 하는 바를 이해할 수 있을까?
아마도 가운데에 가로로 끼어있는 검은 면에 위쪽 큐브를 반사시키고 싶어할 것이다. 그리고 그 반사 효과를 아래쪽에 있는 큐브를 적절하게 가려서 표현하고 싶어하는 듯 하다.
여기서 Stencil Buffer를 적용하여 아래쪽의 큐브를 절반은 완전히 가리고 절반은 중간 정도의 알파값으로 나타낸다면 반사 효과를 멋지게 나타낼 수 있을 것이다.
References
'Computer Graphics' 카테고리의 다른 글
Clip Space와 NDC (Normalized Device Coordinates)의 차이 (0) | 2024.03.30 |
---|