메모리에 맞지 않는 장면을 어떻게 광선 추적 할 수 있습니까?


11

광선 추적 될 장면을 메모리에 저장할 수없는 경우 더 많은 RAM을 머신에 추가하지 않으면 디스크에서 잠재적으로 픽셀 당 여러 번 장면의 다른 부분을로드해야하기 때문에 실제 시간 내에 렌더링하는 것은 비현실적으로 보입니다. .

이 주위에 어떤 방법이 있습니까? 메모리에로드 해야하는 횟수를 줄이기 위해 장면의 특정 하위 집합을 포함하는 많은 계산을 한 번에 수행하는 방법을 생각하고 있습니다. 이 경우 속도를 향상시키는 다른 방법이 있습니까?

답변:


10

장면이 메모리에 완전히 맞지 않으면 코어 외부 렌더링 필드에 들어가는 것입니다. 여기에는 기본적으로 두 가지 접근 방식이 있습니다. a) 주문형 장면 생성 b) 주문형 장면로드

전자의 접근 방식은 모델이 Catmull-Clark를 사용하여 크게 세분화되어 메모리를 많이 사용하지만 기본 메쉬 자체는 메모리에 쉽게 맞도록하는 대부분의 애니메이션 워크 플로와 잘 맞습니다. Pixar는 이것에 대해 몇 가지 논문을 가지고 있지만 (예 : 복잡한 장면에서 분포 광선 추적을위한 Ray Differentials 및 Multiresolution Geometry Caching ), 광선에 부딪 칠 때만 모델이 세분화되고있는만큼만 세분화됩니다 그러한 광선에 대해 합리적입니다 (예 : 확산 상호 반사는 거울 반사보다 정확도가 덜 필요함). 나머지는 지오메트리 캐시 (geometry cache)에 의해 처리되는데, 이는 세분화 된 모델을 메모리에 유지하고 좋은 제거 전략으로 프로세스를 효율적으로 만들 수 있기를 바랍니다.

모든 기본 메시가 메모리에 편안하게 맞으면 메모리에 맞지 않는 하위 수준에서 쉽게 코어를 벗어나 메쉬를 렌더링 할 수 있습니다. 지오메트리 캐시는 또한 메모리 용량에 따라 확장이 가능하여 RAM과 렌더링 시간을 비교할 수 있습니다. 이것은 내가 믿는 자동차 에도 사용되었습니다 .

두 번째 방법은보다 일반적이며 세분화를 많이 사용하지 않습니다. 대신, 장면은 아티스트에 의해 만들어 졌을 가능성이 높으며 이미 메모리에 개별적으로 맞는 합리적으로 작은 물체로 분할되어 있습니다. 아이디어는 두 계층 (kD- 트리 또는 경계 볼륨 계층)을 유지하는 것입니다. 장면에있는 오브젝트의 경계 상자 만 저장하는 최상위 계층 구조와 실제 지오메트리를 저장하는 하위 계층 구조입니다. 각 객체마다 하나의 저수준 계층이 있습니다.

이 방법에서는 디스크의 각 개체와 함께 경계 상자를 이미 저장하는 것이 이상적입니다. 장면이로드되면 처음에 최상위 계층 구조 만 작성합니다. 즉, 지오메트리가 아닌 경계 상자 만 살펴 봐야합니다. 그런 다음 광선 추적을 시작하고 계층 구조를 통과합니다. 광선이 최상위 계층의 리프 노드에 도달 할 때마다 (즉, 오브젝트의 경계 상자에 도달 할 때) 해당 오브젝트가 메모리에로드되고 하위 레벨 계층이 빌드됩니다. 광선은 계속해서 그 물체를 추적합니다. 낮은 수준의 계층 구조를 최대한 메모리에 유지하는 객체 캐시와 결합하면 성능이 합리적으로 향상됩니다.

이러한 접근 방식의 첫 번째 이점은 적중되지 않은 객체가로드되지 않으므로 장면의 가시성에 자동으로 적응한다는 것입니다. 두 번째 이점은 많은 광선을 추적하는 경우 광선에 닿으면 즉시 물체를로드 할 필요가 없다는 것입니다. 대신, 광선을 잡고 충분한 광선이 해당 물체에 닿을 때까지 기다릴 수있어 여러 광선에 대한 부하가 상쇄됩니다.

불일치 한 광선으로 인한 스 래싱을 피하기 위해이 방법 을 생산 경로 추적위한 정렬 된 지연 음영 과 같은 광선 정렬 알고리즘과 결합 할 수도 있습니다 . 언급 된 논문은 Big Hero 6에 사용 된 Disney의 Hyperion 렌더러의 아키텍처를 설명하므로 프로덕션 규모에서 장면을 처리 할 수 ​​있습니다.


1
이것은 매우 흥미 롭습니다! 당신이 연결 한 디즈니 종이도 마찬가지입니다.
John Calsbeek

+1 항상 궁금했던 것에 대한 많은 답변!
Rotem

7

장면을 공간 구조 (일반적인 방법으로 Bounding Volume Hierarchy )로 구성하면 일종의 가상 장면을 사용할 수 있습니다 ( 가상 텍스처 와 관련하여이 용어를 구성하고 있습니다 ).

메모리 관리자는 한 번에 제한된 수의 경계 상자 만로드하고 하나를 검색하는 작업을 추상화합니다.

이런 식으로 상자는 필요한 경우에만로드됩니다. 광선이 경계 상자에 닿으면 상자가로드되어 충돌을 해결합니다. 나중에 다른 상자를로드해야 할 때 사용하지 않은 상자는 삭제되어 새 상자를위한 공간을 마련합니다.

이 모든 상자를로드하고 삭제하면 광선 일관성이 속도의 주요 요소가됩니다. 이미 적재 된 상자를 먼저 처리하기 위해 광선을 재정렬하여 적재를 연기하는 것이 더 개선 될 수 있다고 생각합니다.


예, 이런 식입니다.
joojaa

1

당신이하는 일은 이전에 맞은 것을 기반으로 디스크에서 삼각형을 메모리에로드하는 것입니다. 가장 가까운 삼각형을 먼저 시작할 수 있습니다. 그 이유는 한 영역에서 광선이 같은 삼각형을 반복해서 치기 쉽다는 것입니다. 그리고 결국 당신은 다소 효율적입니다. (이러한 이유로 순서를 지키지 않는 폐색 추적에서 마지막 적중 삼각형을 캐시하는 것이 좋습니다)

둘째, 삼각형을 공간 트리에 저장하여 디스크에서 빠르게 검색하여 근접성에 따라 메모리에있는 부분을 갱신 할 수 있습니다. 광선을 방해하는 가지만로드하십시오. 옥트리와 같은 일종의 복셀 트리라면 보조 광선을 정렬하고 일관성으로 해결할 수 있습니다. BSP 트리는 또한 가지 치기 영역에서 다소 우수합니다.

노이즈가 렌더링되지 않는 경우 이것이 실패하지만 대부분의 장면 버킷에서 합리적으로 효율적인 경우가 있습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.