원문 : https://developer.nvidia.com/sites/default/files/akamai/gameworks/samples/DeinterleavedTexturing.pdf


샘플 페이지 : https://docs.nvidia.com/gameworks/content/gameworkslibrary/graphicssamples/d3d_samples/deinterleavedtexturingsample.htm


주의 : 번역이 개판이므로 이상하면 원문을 참고하세요.


주의 : 허락받고 번역한 것이 아니므로 언제든지 내려갈 수 있습니다.



Louis Bavoil

lbavoil@nvidia.com


March 2014


Overview


이 DirectX 11 샘플은 Deinterleaved Texturing 접근법을 사용하여 큰, 저밀도( sparse )의, 지터링된( jittered ) 포스트 프로세싱( post processing ) 필터( 여기에서 SSAO 패스는 4x4 의 랜덤 텍스쳐를 사용합니다 )를 더욱 캐시-효율적으로 만들 수 있는 방법에 대해서 설명합니다. 먼저 전체 해상도 입력 텍스쳐를 16 개의 쿼터-해상도( quarter-resolution ) 텍스쳐의 배열로 재구성됩니다. 다음으로 패스 당 하나의 쿼터-해상도 텍스쳐를 소스로 사용하는 16 개의 개별 쿼터-해상도 패스들을 사용하여 필터를 렌더링합니다.


그림 1. Deinterleaved Texturing 은 픽셀당 랜덤화( randomization )을 사용하는 단일 패스보다 2.3 배가 더 빠르지만 결과는 매우 비슷합니다.


Deinterleaved Texturing


Introduction


우리가 속도를 올리려고 하는 포스트 프로세싱 필터들은 큰, 저밀도의, 지터링된 필터들입니다. 예를 들어 픽셀 단위의 디스크 샘플링( disk sampling, 역주 : 어떤 거리 r 을 이용하여 랜덤하게 임의의 점을 찍는 샘플링 기법입니다. Poisson disk-sampling 을 줄여서 disk-sampling 이라 부르는 것 같습니다 ) 과 랜덤 텍스쳐 좌표( randomized texture coordinate ) [McGuire et al. 2012 ]를 사용하는 SSAO 픽셀 셰이더가 있습니다. 이 접근법으로부터의 이점을 얻을 수 있는 알고리즘은 SSDO [Ritschel et al. 2009] 와 SSR [Kasyan et al.2011]입니다. 이 모든 알고리즘들은 구부러짐( bending )을 노이즈( noise )와 교환하기 위해서 텍스쳐 좌표를 랜덤화합니다. 필터의 원래 구현이 가진 성능이 주로 텍스쳐 지연에 의해서 제한되고 있다고 가정합니다. 우리의 목표는 품질을 희생시키지 않고 그런 큰 필터들의 속도를 개선하는 일반적인 접근법을 찾아내는 것입니다.


그림 2. 고정 샘플링 패턴.


그림 2 에 있는 예제 샘플링 패턴에서, 인접 픽셀들은 인접 샘플들을 페칭( fetching )합니다. 이 경우에, 각 픽셀들은 중심 픽셀에 대해 상대적으로 고정된 옵셋( offset ) 위치에 있는 4 개의 텍셀들을 수집합니다. 잠금 단계( lock step )에서 실행되고 있는 인접 픽셀들의 쌍을 보면( 픽셀들은 0 으로 표시되어 있습니다 ), 각 샘플들을 위한 샘플 좌표들은 서로에 대해 인접해 있습니다( 샘플들은 1, 2, 3, 4 로 표시되어 있습니다 ). 그러므로 이 샘플링 패턴은 공간적인 텍스쳐 지역성( locality )을 가지고 있으며, 이는 텍스쳐-캐시 하드웨어에 대해 친화적입니다( 역주 : 왼쪽 그림은 고정 크기 샘플링 패턴의 옵셋을 보여 줍니다. 오른쪽은 녹색 0 을 중심으로 샘플링을 한 후에, 노란색 0 을 중심으로 샘플링을 수행했을 때, 각각의 샘플링 텍셀들이 이전에 샘플링 했던 텍셀들과 인접해 있음을 보여 줍니다. 메모리상 위치가 가깝기 때문에 지역성이 높고 캐시 적중도( cache hit )가 높다고 하는 것 같습니다 ).


그림 3. (a) 랜덤 샘플링. (b) 영역( sectored ) 샘플링.


이제 샘플링 패턴에 대한 임의의 픽셀 단위 랜덤화를 사용하는 그림 3 (a) 의 2 개의 픽셀들을 살펴 봅시다. 2 개의 인접한 픽셀들을 위한 첫 번째 샘플의 족적( footprint )이 퍼져 있습니다. 이는 텍스쳐 하드웨어에서 비효율성을 발생시킬 것입니다. 이 경우에 인접한 픽셀들이 멀리 떨어져 있는 텍셀들을 페칭해야 하므로 공간적 지역성이 떨어집니다.


일반적인 전략은 완전히 랜덤화된 샘플링보다는 영역화된 떨리는 샘플링을 사용하는 것입니다. 이 경우에, 우리는 4 개의 샘플을 가지고 있으며 커널 영역을 네 개의 쿼터들로 하위분할할 수 있습니다. 좌상단 쿼터에서 샘플 1 을 취하며, 우상단 쿼터에서 샘플 2 를 취하는 식입니다. 이런 방식으로 잠금 단계에서 실행되고 있는 샘플들이 각 영역 안에서 서로 가깝게 존재하게 됩니다. 그러므로 그것들은 공간적 지역성이 높아집니다. 하지만 큰 커널들에 대해서는 인접 픽셀들이 여전히 그것들의 영역 안에서 멀리 떨어져 있는 텍셀들을 페칭하게 될 것이며 텍스쳐-캐시 적중율 문제를 겪게 될 것입니다.


Previous Art


단순한 전략은 혼합-해상도 입력들을 사용하고, 입력에 대한 고해상도와 저해상도의 버전을 둘 다 바인딩하는 것입니다. 그리고 :


  • 커널의 중심 탭( tap )을 위해 전체 해상도 텍스쳐를 사용합니다.
  • 분산된 멀리 떨어진 탭들을 위해, 저해상도 텍스쳐를 사용합니다.


다른 전략은 밉맵화( mip-mapped )된 입력 텍스쳐를 [McGuire et al.2012] 에 있는 것처럼 사용하여 현재 픽셀에서의 스텝( step ) 크기에 기반한 샘플링된 LOD 를 적용하는 것입니다. 이 방식을 사용하면, 인접 픽셀들은 같은 밉 레벨에 있는 서로에게 더 가까운 샘플들을 페칭할 것입니다.


이 두 전략들은 여전히 공간적 지역성의 관점에서 덜 최적화되어 있습니다. 왜냐하면 그것들은 밴딩( banding, 역주 : 띠같은 모양의 아티팩트 )을 피하기 위해서 여전히 픽셀당 지터링 메커니즘을 사용할 필요가 있기 때문입니다.


Our Approach


우리의 접근법은 단일 샘플링 패턴 당 하나의 저해상도 이미지를 렌더링하는 것입니다. 그것은 [Keller and Heidrich 2001], [Segovia et al. 2006], [Bavoil and Jansen 2013] 에서 나온 오래된 아이디어입니다.


그림 4. 2x2-interleaved 샘플링 패턴.


우리는 그림 4 의 왼쪽에 나온 2x2 크기의 interleaved 샘플링 패턴에서부터 시작했습니다( 역주 : 신호처리에서 interleaving 은 비트를 일정한 단위로 재배열하여 전송하는 것을 의미합니다 ). 그리고 하나의 개별 패스에서 녹색 픽셀들을 모두 함께 처리합니다( 그것은 녹색 샘플링 패턴을 가집니다 ). 그리고 나서 붉은색 샘플링 패턴을 다른 개별 패스에서 처리하는 식입니다.


그 결과들을 모두 중간( intermediate ) 텍스쳐들에 저장합니다. 그래서 이러한 작업의 끝에서는 전체 해상도 출력을 처리한 것입니다. 샘플링 패턴 당 개별 패스들에서 모든 픽셀들을 처리했으므로, 픽셀 셰이더에서는 픽셀 당 랜덤화가 더 이상 존재하지 않습니다. 더욱이 다운샘플링된( down-sampled ) 입력 텍스쳐들을 사용하기도 했으므로 인접 픽셀들은 인접한 텍셀들을 페칭할 수 있습니다.


요약하면:


  • 샘플링 패턴들을 개별적으로 렌더링합니다.
  • 각 패스들에서, 다운샘플링된 입력 텍스쳐들을 사용합니다.

우리는 이 접근법을 Deinterleaved( 역주 : 신호처리에서 디인터리빙은 인터리빙되어 전송된 비트들을 처리하는 것을 의미합니다 ) Texturing 이라고 부릅니다.


Algorithm


그림 5. [ 1 단계 ] 입력 텍스쳐를 deinterleaving.


전체 해상도 입력 텍스쳐로부터 시작해서 ( 이 경우에는 2x2 interleaved ) 그림 5 에서처럼 deinterleave 합니다.


샘플링 패턴 당 하나의 텍스쳐를 생성합니다. 2x2 샘플링 패턴을 사용하는 이 예제에서, 텍스쳐들은 절반( half )-해상도입니다. 우리는 MRT 를 사용해 deinterleaved data 를 렌더링하고 그 것들을 4 개의 슬라이스( slice )를 가진 절반-해상도 2D 텍스쳐 배열에 저장합니다.


이 deinterleaving 단계는 구조체 배열( Array Of Struct )을 배열들의 구조( Struct Of Arrays )로 변환하는 것으로 볼 수 있습니다. 우리는 동일한 입력 정보와 출력 정보를 가지고 있으며, 그냥 입력을 재구성하면 됩니다.


그림 6. [ 2 단계 ] deinterleaved 데이터 샘플링.


다음으로는 deinterleaved 텍스쳐 당 하나의 드로 호출을 수행하고 각 드로 호출들은 하나의 샘플링 패턴을 가집니다. 이러한 각 드로 호출들은 텍스쳐 배열 A 로부터 단일 슬라이스를 샘플링하고 있으며 텍스쳐 배열 B 로 단일 슬라이스를 출력하고 있습니다.


이 드로 호출들의 픽셀 셰이더에서는 픽셀 당 지터링이 사용되지 않으며 인접 픽셀들은 가까운 텍셀들을 페칭합니다. 이는 텍스쳐 캐시에 친화적입니다.


그리고 모든 텍스쳐 슬라이스들이 저해상도( 절반-해상도 )이므로, 비디오 메모리로부터 셰이더 유닛들로 작업 집합을 전송하기 위해 요구되는 메모리 대역폭이 적으며, 성능을 상당히 개선하는데 도움을 줄 수 있습니다.


그림 7. [ 단계 3 ] 출력을 다시 interleaving.


이제 우리는 각 샘플링 패턴을 위해 4 개의 개별 결과들을 생성했습니다. 그 결과들을 다시 전체-해상도 텍스쳐로 interleave 합니다. 그것은 전체-해상도 픽셀 셰이더 패스이며, 텍스쳐 배열 B 로부터 페치하는 하나의 텍스쳐를 사용합니다.


이 기법은 이 SDK 샘플이 보여주는 것처럼 4x4 interleaving 으로도 확장될 수 있습니다. Deinterleaving 단계의 경우, 4 개의 MRT 를 사용해 1 번의 드로 호출을 수행하는 대신에, 8 개의 MRT 를 사용해 2 번의 드로 호출을 사용합니다. 16 개의 가능한 샘플링 패턴들을 처리하고, 나머지 단계들은 동일하게 유지합니다.


Acknowledgments


Sibenik 모델은 Marko Dabrovic 이 만들었습니다. 이 샘플에서 사용된 AT-AT 모델은 Brad Blackburn 이 만들었으며, http://www.scifi3d.com 에서 다운로드할 수 있습니다.


References


[Keller and Heidrich 2001] Alexander Keller and Wolfgang Heidrich. “Interleaved Sampling.” Proceedings of the Eurographics Workshop on Rendering. 2001.


[Segovia et al. 2006] B. Segovia, J. C. Iehl, R. Mitanchey, B. Péroche. “Non-interleaved Deferred Shading of Interleaved Sample Patterns.” Graphics Hardware 2006.


[Ritschel et al. 2009] Tobias Ritschel, Thorsten Grosch, Hans-Peter Seidel. “Approximating Dynamic Global Illumination in Image Space.” I3D 2009.


[Kasyan et al. 2011] Nickolay Kasyan, Nicolas Schulz, Tiago Sousa. “Secrets of CryENGINE 3 Graphics Technology.” Advances in Real-Time Rendering Course. SIGGRAPH 2011.


[McGuire et al. 2012] Morgan McGuire, Michael Mara, David Luebke. “Scalable Ambient Obscurance.” HPG 2012 [Bavoil and Jansen 2013] Louis Bavoil and Jon Jansen. “Particle Shadows & Cache-Efficient Post-Processing.”. GDC 2013

+ Recent posts