SungJin Kang

SungJin Kang

hour30000@gmail.com

© 2024

Dark Mode

Guard Band Clipping (번역)

이 글은 A trip through the Graphics Pipeline 2011, part 5의 Guard Band Clipping 부분을 번역한 글입니다.
Xcode GPU Capture를 보다 “Primitives Culled(Guard-Band)”라는 데이터가 있어 Guard-Band가 뭔지 궁금해서 공부해보았다.


Guard-band clipping

이름이 조금 오해를 부르는데. Guard-band clipping은 클리핑을 하는 fancy한 수단이 아니다. 실제로는 정반대로 클리핑을 하지 않는 수단이다.

원리는 매우 간단하다. 대부분의 Primitive(ex. 삼각형)들은 클립 plane의 좌,우,상,하를 부분적으로 걸치는데, 그것들은 전혀 클리핑될 필요가 없다. GPU의 삼각형 레스터라이즈는 결국 전체 화면 영역을 스캔하면서(혹은 더 정확히는 scissor rect를 스캔하며) 모든 픽셀들에 묻는 것이다. “이 픽셀이 현재 삼각형에 의해 덮여(가려져)있니?”(실제로는 약간 더 복잡하지만, 일단 대략적인 동작은 이러하다). 이는 뷰 포트 내에 완전히 속하는 삼각형뿐만 아니라 클리핑 plane의 상단, 우측을 넘어 걸치는 삼각형에도 동일하게 동작한다. 이러한 삼각형 커버리지 테스트가 믿을만하다면, 우리는 클리핑 plane의 좌, 우, 상, 하에 대해 클리핑을 수행할 필요가 없다.

그 커버리지 테스트는 일반적으로 고정 정밀도를 가진 정수형 연산 장치에서 수행된다. 그 말은 즉 너가 삼각형의 버텍스를 멀리 멀리 움직이다보면, 결국 정수형 오버 플로우가 발생할 것이고 잘못된 커버리지 테스트 결과를 얻을 것이라는 말이다. 이 말은 즉 레스터라이저가 산출한 픽셀이 실제로는 삼각형 내에 있지 않을 수 있다는 말이고 이는 당연히 잘못된 동작이다. ( 이러한 동작을 하는 하드웨어는 스펙을 준수하지 못한 것이다 )

이러한 문제를 해결하기 위해 두 가지 방법이 존재한다.
하나는 삼각형이 어떻게 생겼는지와 상관 없이, 삼각형 커버리지 테스트가 절대로 잘못된 결과를 만들지 않는다고 보장하는 것이다. 이것이 보장된다면, 클리핑 plane에 대해 클리핑을 수행할 필요가 전혀 없을 것이다. 이는 “무제한(infinite) guard-band”라고 불리는데 이는 guard-band가 무제한이기 때문이다.(오버 플로우 등의 문제가 발생할 가능성이 전혀 없음.)
두 번째 해결책은 삼각형을 클리핑 하는 것이다. 레스터라이즈가 안전하게 삼각형 테스트를 하지 못한다고 판단되는 경우(삼각형이 오버 플로우가 발생할 가능성이 있는 구역에 걸치는 경우)에 대해 클리핑을 수행하는 것이다. 예를 들면 레스터라이저가 -32768~32767까지의 정수형 삼각형 좌표를 다룰만큼의 충분한 비트 수를 가지고 있다고 가정해보자. 여전히 뷰 plane을 가지고 뷰포트 컬링 테스트를 수행(이 삼각형이 뷰 프러스텀 밖에 있는지)해야할 뿐만아니라, 프로젝션/뷰포트 transform의 결과 좌표 값이 버퍼 오버플로우와 같은 문제가 발생하지 않을 정도에 위치해 있게 만들기 위해 guard-band 클리핑 plane에 대한 클리핑도 수행해야한다.
이미지를 한번 보자.

guardband_clip

이미지 가운데에 파란색 테두리로 둘러싸여 있는 흰색 사각형은 뷰 포트를 나타낸다. 이를 둘러싸고 있는 분홍빛의 큰 형역은 guard band를 나타낸다. 이 이미지에서는 뷰 포트가 작아보이지만, 실제로 나는 큰 것을 그려 넣었따. guard-band clip range는 -32768~32767이고, 뷰 포트는 5500 픽셀 정도의 너비이다. 그리고 거대한 삼각형들이 있다. 어쨌든.. 삼각형들은 몇 몇 중요한 케이스들을 보여주는데.
일단 노란색 삼각형은 흔한 경우이다. guard-band 밖으로 걸치지는 않았고, 뷰포트 밖으로는 걸쳐있다. 이 삼각형은 guard-band 클리핑을 통과한다. 따로 특별한 처리가 필요 없다는 것이다.(guard-band 안에 있으니 레스터라이즈시 오버 플로우 등의 문제를 일으킬 가능성이 없다고 판단).
녹색 삼각형은 뷰 포트의 영역 밖에 있고, guard-band에 완전히 속해있다. 이 삼각형은 레스터라이즈 단계까지도 못 간다.(뷰 포트 컬링에서부터 걸러진다).
파란색 삼각형은 guard-band 클리핑 영역 밖으로 걸쳐있다. 버퍼 오버플로우 등의 문제를 일으킬 가능성이 높으니 클리핑이 필요하다. 다만 뷰 포트 영역에 완전 벗어나 있으니, 레스터라이즈 이전 뷰 포트 컬링에서 이미 걸러졌을 것이다.
마지막으로 보라색 삼각형은 뷰 포트 영역, guard band 클리핑 영역 두 영역 모두에 벗어나 걸쳐있다. 클리핑이 필요한 삼각형이다.

references : Guard Band Clipping in Direct3D