위 포스팅에 이어지는 글
틀린 부분이 있다면 알려주세요~
RT Core?
RT Core는 RTX 시리즈의 그래픽 카드를 구성하는 Ray tracing을 위한 핵심 unit이다. 이전 포스팅에서 실시간 레이 트레이싱의 병목 지점은 트리를 Traversal하는 부분(교차 테스트가 이를 포함)이라 했다. 이를 CUDA같은 GPGPU 기법을 사용하더라도 SW로 구현되는 이상 한계가 있다. 그래서 NVIDIA에서 이러한 작업들을 하드웨어로 구현한 것이 RT Core이다. RT Core는 개발 단계에서 원래 TTU(Tree Traversal Unit)라는 이름을 가졌다고 한다.
번역해보면 트리를 탐색(순회)하는 장치이다. 그리고 이것이 실제로 RT Core의 전부라 해도 과언이 아니다. RT Core가 하는 일은 2가지로 다음과 같다.
- Tree traversal (트리 탐색)
- Intersection testing (교차 검사)
이전 글에서 언급했던 공간 분할 트리와 같은 자료 구조가 필요한 이유는 일종의 최적화 때문이다. 기본적으로 레이 트레이싱은 ray와 충돌하는 지점(intersection point) 삼각형 정보를 알아내는 것이다. 존재하는 모든 오브젝트들을 검사하여 intersection point를 조사할 수 있지만 비효율적이다. 이를 위해 검사할 단위를 나누어 진행하는 것이다.
위 오른쪽 그림은 k-d tree로 공간을 분할한 그림이다. 왼쪽은 각 subspace를 트리로 구성한 것이다. 위 오른쪽 그림에서 분홍색 사각형이 포함하는 점들을 찾는다고 생각해보자. 공간이 분할되어 있지 않다면 모든 점들을 확인하며 분홍색 사각형 범위에 포함하는지 확인해야 한다. 만약 위처럼 공간이 분할되어 있다면, 트리의 왼쪽 노드들은 검사할 필요가 없는 것이다.
이처럼 어떤 방법으로든 공간을 나누어 탐색 속도를 줄여야 한다. 이러한 기법은 레이 트레이싱 뿐만 아니라 카메라 시야 밖의 물체는 아예 파이프라인으로 보내지 않음으로써 렌더링 속도를 향상시키는 데에도 사용된다.
BVH(Bounding Volume Hierarchy)
공간을 분할하는 자료구조로 k-d tree, octree, BSP 트리 등이 있지만 레이 트레이싱에선 오브젝트 단위로 분할하는
BVH(Bounding Volume Hierarchy)를 사용한다. BVH는 레이 트레이싱에서 빠른 계산(가속)을 위한 자료구조로
acceleration structure라고도 불린다. RT Core에서 BVH 자료구조를 지원하여 이를 기반으로 트리를 traversal 한다. k-d tree와 같은 공간 분할 트리와의 차이점은 <좌표를 기준으로 공간을 분할하는 것>이 아닌 오브젝트 단위로 분리한다.
아래 왼쪽 그림과 같이 각 오브젝트를 감싸는 박스 혹은 볼륨을 바운딩 박스 or 볼륨이라 하는데 BVH는 각각의 바운딩 박스를 노드로 가진다. 이처럼 바운딩 박스를 계층 형태로 만든 것이 BVH이다. 각각의 바운딩 박스들은 서로 겹칠 수 있음을 확인하자.
아래는 하나의 오브젝트를 각각 BVH와 octree로 분할한 것이다. 왼쪽이 BVH다.
아래 그림은 어떤 식으로 분할하여 BVH를 구성하는지 보여준다.
BVH의 idea는 각 ray마다 모든 오브젝트를 교차 검사하는 것이 아닌, 각 ray와 바운딩 박스를 검사하는 것이다. 만약 ray가 바운딩 박스와 충돌했다면 그 바운딩 박스 내의 오브젝트를 조사하면 된다. Pseudo code로 표현해보면 다음과 같다.
if(ray와 bounding box가 충돌)
return bounding box 내의 몇 개의 오브젝트와 충돌
else
return false;
아래 그림을 예로 들어보면
먼저 전체를 의미하는 N1과 ray의 교차 검사를 진행한다. 교차하므로 N2를 확인한다. N2와도 교차하므로 N2의 자식 노드를 검사한다. N4와 N5 모두 ray와 교차하지 않으므로 그 아래 삼각형들은 검사할 필요가 없다. 다음 N3와 교차 확인 후 N6를 확인한다. 교차하므로 N6 내의 삼각형들과의 교차 검사를 진행한다. O6 삼각형에서 ray hit을 확인한다. 이후 N7과 교차 확인 후 O7 O8 삼각형들과의 교차 검사를 진행한다.
RT Core는 이러한 동작을 수행한다. RT Core가 이러한 작업을 하기 전에 탐색하려는 BVH가 미리 생성되어 있어야 한다. 이를 building 한다고 한다. BVH를 빌딩하고 ray를 생성하는 작업은 GPU의 SM(Streaming Multiprocessor)가 담당한다. 이후 RT Core가 데이터를 일정 단위로 가져와(fetch) BVH와 ray의 교차 검사를 진행한다. 위에서 보았듯이 바운딩 박스 혹은 삼각형과의 교차 검사가 필요하다. 따라서 RT Core는 다음과 같이 두 가지의 검사 단위를 가진다.
바운딩 박스 내부에 더 이상 바운딩 박스가 존재하지 않으면 물체와 검사를 진행해야 하므로, 하나의 바운딩 박스에 너무 많은 물체가 있으면 성능이 하락할 것이다. 바운딩 박스를 정의하는 방법은 여러가지가 있지만 레이 트레이싱에선 AABB(Axis-Aligned Bounding Box) 모델을 사용한다. 쉽게 말하면 기준 축과 평행한 면들로 이루어진 박스이다.
SSR vs Ray Tracing
레이 트레이싱으로 얻는 다양한 이점 중 반사와 굴절 등을 잘 표현한다는 특징이 있다. 기존에는 실시간 반사 효과를 주기 위해 SSR(Screen Space Reflection)란 기법을 사용했다.
이 기법의 특징은 카메라에 보이는 물체들의 정보를 통해 반사 효과를 생성한다. 따라서 반사 효과를 얻으려는 대상이 카메라 밖으로 벗어나면 그 대상에 대한 반사 효과는 표현하지 못한다는 단점이 있다.
아래 영상은 SSR로 구현된 것인데, 나무가 시야에 들어올 때만 물에 반사되는 모습을 볼 수 있다.
반면 아래 그림은 레이 트레이싱으로 구현된 것인데 나무가 시야에서 사라져도 여전히 반사되는 모습을 볼 수 있다. 레이 트레이싱은 카메라로부터 광선을 발사하여 실제로 광원까지의 경로를 추적하기 때문에 가능한 것이다.
BVH는 사실 더 복잡하고 레이 트레이싱과 관련된 더 많은 내용들이 있지만 여기선 여기까지 소개하고 나중에 지식이 더 깊어지면 다음 포스팅에 작성..
Reference
- gigglehd.com/gg/hard/4594569
- www.hardwaretimes.com/nvidia-ampere-traversal-coprocessor-wont-be-a-separate-chip-likely-an-on-die-component/
- www.hardwarezone.com.sg/feature-what-you-need-know-about-ray-tracing-and-nvidias-turing-architecture/rt-cores-and-tensor-cores
- blog.naver.com/dmatrix/222069456468
- blog.hybrid3d.dev/2019-03-22-raytracing-kdtree-bvh
- developer.nvidia.com/discover/ray-tracing
- developer.nvidia.com/blog/thinking-parallel-part-ii-tree-traversal-gpu/
- cseweb.ucsd.edu/~sht005/ray_tracing_info.html
'게임 공부 > Computer graphics' 카테고리의 다른 글
쿼터니언은 벡터로도 사용 가능 (0) | 2021.08.19 |
---|---|
광선 추적(Ray Tracing)은 무엇인가? - (1) (2) | 2021.04.23 |
조명(Lighting) 기초 (0) | 2021.03.12 |
5 - 출력 병합(Output merging) (0) | 2020.08.13 |
4 - 프래그먼트 처리(Fragment processing) (0) | 2020.08.10 |
댓글