Rendering 연산을 하면서 불필요한 연산을 줄이는 2가지 (Clipped/Culled) 방법이 있어서 정리해보았다. 아래 2가지 방법 모두 불필요한 삼각형을 제거하거나, 크기를 조절하여 Rendering 연산량을 최소화하는 기술인 것 같다.
Clipped
- 특정 물체의 전체가 화면에 표시되는 것이 아니라 특정 부분만 화면에 표시될 때 연산을 줄이는 방법을 의미하는 것 같다. 물체 전체가 Rendering 되지 않는 경우 특정 부분만을 작은 삼각형으로 나누는 작업을 통해서 Rendering 작업을 수행하게 된다. 간단한 예로 그림 1과 같이 2개의 삼각형이 있는데 1개의 삼각형은 1개의 모서리만 화면을 벗어나고, 다른 삼각형은 2개의 모서리가 화면을 벗어나 있다. 이 경우 1개의 모서리가 벗어난 삼각형의 경우 2개의 작은 삼각형으로 만들어서 Rendering 연산을 수행하게 된다. 반면 2 모서리가 화면에서 벗어난 경우 작은 하나의 삼각형을 만들어서 Rendering 연산을 수행하게 된다.
그림 1: 삼각형을 작은 삼각형 또는 삼각형 2개로 나누는 작업 (출처 1)
Culled
- 화면에 표시되지 않는 물체에 대한 연산을 제거하는 방법이다. 출력되지 않는 물체는 Rendering 연산 작업을 전혀 수행하지 않아도 되므로 연산작업에서 제외한다. 하지만 모든 삼각형을 화면에서 벗어났는지 아닌지 하나하나 확인하는 과정도 많은 연산이 필요해서 보통 여러 개의 삼각형을 묶어서 큰 단위(Bounding Volumes)로 연산을 수행한다 (이 부분은 추후 공부를 다시 하게 되면 정리를 할 예정이다). 보통 아래의 3가지 이유로 인해서 Culling이 발생한다.
- Frustum Culling: 표시되는 화면에서 완전히 벗어난 삼각형(물체를) 제거하는 경우
- Occulusion Culling: 특정 물체에 가려져서 보이지 않는 삼각형을 제거하는 경우
- Backface Culling: 카메라가 보이는 방향과 반대로 향하는 삼각형을 제거하는 경우
- 아래 출처에서 읽은 내용인데 Occulusion 과 Backface Culling의 차이를 정확하게는 잘 모르겠다. 대략 이해한 바에 의하면 Occulusion의 경우 Depth 연산을 통해서 보이지 않는 삼각형을 제거하는 것 같다. Backface의 경우 삼각형이 보이는 방향과 카메라가 포인팅(카메라의 렌즈가 향하는 방향)하는 방향이 같으면 연산에서 제외한다는 것 같다. 이 부분은 기존 Ray Tracing에서 공부했던 부분이다. 예를 들어서 Cube가 있으면 6개의 면으로 구성되어 있다. 하지만, 카메라가 볼 수 있는 면은 항상(최대?) 3개밖에 되지 않는다. 그렇기 때문에 카메라가 포인팅 하는 방향과 면이 위치한 방향이 같으면 해당 면에 해단 Rendering연산을 할 필요가 없다. 해당 연산은 방향 벡터를 사용하여서 연산을 수행한다. 문제는 Backface 연산의 경우 Occulusion연산을 통해서도 제거가 가능한 것 같다.
결과적으로 위 2가지 방법 모두 필요없는 부분 연산을 제거하여서 Rendering 연산 성능을 향상시키는 방법이다. 위 예제는 정말 단순한 방법인 것 같다. 각 부분에 대해서 더 공부를 하게 되면 사용되는 Algorithm을 따로 정리할 계획이다.
출처
- http://www.cs.uu.nl/docs/vakken/gr/2011/Slides/08-pipeline2.pdf
- https://sglab.kaist.ac.kr/~sungeui/cg/Slides/Lecture07.pdf
- http://www.differencebetween.net/technology/software-technology/difference-between-clipping-and-culling/
- http://www.cs.cmu.edu/afs/cs/academic/class/15462-f12/www/lec_slides/462_gpus.pdf