| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- SIMD
- hzb
- rendering
- vulkan
- ue4
- GPU
- DX12
- RayTracing
- shader
- Shadow
- wave
- texture
- Study
- atmospheric
- forward
- Graphics
- deferred
- Nanite
- UE5
- ShadowMap
- scalar
- DirectX12
- SGPR
- optimization
- VGPR
- Wavefront
- GPU Driven Rendering
- scattering
- 번역
- unrealengine
- Today
- Total
RenderLog
[번역]Antialiased Deferred Rendering 본문
개인 공부용으로 번역한 거라 잘못 번역된 내용이 있을 수 있습니다.
또한 원작자의 동의 없이 올려서 언제든 글이 내려갈 수 있습니다.
소스코드는 첨부파일(출처 : https://github.com/NVIDIAGameWorks/D3DSamples/tree/master/samples )
Description
이 DirectX 11 예제는 MSAA 를 Deferred Shading 에서 어떻게 구현하는지를 보여준다.

APIs Used
- D3D11
App-Specific Controls
이 샘플은 아래의 앱에서의 컨트롤이 있다.
| Device | Input | Result |
| mouse | Left-Click Drag | Rotate the scene |
| Middle Button Scroll | Zoom the scene | |
| Right-Click Drag | Rotate the light | |
| keyboard | F2 | Change rendering device. |
| F3 | Toggle FXAA |
Technical Details
개요
이 DirectX 11 예제는 MSAA(Multi sample antialiasing) 를 Deferred Shading 에서 어떻게 구현하는지를 보여준다. 먼저 이 아이디어는 Scene geometry 를 Multisample-enabled g-buffer 에 렌더링하고 어떤 픽셀이 complex(이 픽셀이 한개 이상의 fragment를 포함하는지 여부) 인지와 어떤 빈도의 sample로 Shading 되어야 하는지를 결정합니다. (즉, 특정 픽셀에 supersampled을 할지 말지), 그리고 마지막으로 이에 맞춰서 Shading을 수행합니다.
이 샘플은 목표하는 바를 얻기위해 다양한 접근 방식을 구현합니다. 우리는 간단히 SV_Coverage 사용하거나 또는 픽셀이 여래개의 다른 fragment를 갖고 있는지 결정하기 위해서, 픽셀 범위내에서 샘플들 사이의 비연속성을 확인할 수 있습니다.
우리는 일반픽셀과 complex 픽셀들에 2개의 분리된 패스로 쉐이딩을 수행할 수 있고, 그래서 Thread Coherency(역주 : 쉐이더에서 분기문을 사용하지 않아서 더 빠르다는 의미 같습니다.)가 향상됩니다. 마지막으로 우리는 complex 픽셀에서 Unique fragment 수를 결정하고, Unique fragment 수에 따라서 쉐이딩 수행을 적절하게 조절할 수 있습니다. 이 샘플은 4x MSAA 를 구현하며, 이 것은 더 많은 샘플 개수로 쉽게 확장가능 합니다.

Deferred Shading with MSAA
소개
MSAA는 Geometry Lighting (이 샘플에서는 전체화면을 덮는 사각형을 그리는 방식사용)이 Scene geometry 로 부터 분리되어진 것이 디퍼드 쉐이딩의 주요 단점이었다. 그래서 우리는 하드웨어가 어떤 픽셀이 가장자리인지 결정하는 이런 전통적인 포워드 MSAA 렌더링에서 얻을 수 있는 이득을 얻지 못한다. 디퍼드 렌더링 시나리오에서, 우리는 계산과 분기를 가능한 최소화 하면서 어떤 픽셀이 complex 인지 결정할 수 있어야 하며, 샘플당 하나의 빈도수로 shade 를 할 수 있어야 한다.
Complex Pixel Detection
디퍼드 쉐이딩에서 MSAA를 하는 작업중 첫번째로 중요한 작업은 하나 이상의 Unique fragment를 포함하는 Complex 픽셀을 탐지하는 것이다. 이 샘플에서는 이것을 하기 위해서 2가지 접근법을 구현했다. 첫번째는 fragment에 의해 다루어진 픽셀을 계산하는 SV_Coverage를 사용한다. 아래의 그림에서 SV_Coverage의 예를 보여준다.

만약에 커버리지 마스크가 1111이 아닌 하나의 픽셀에 샘플이 있다면, 우리는 그것은 complex 로 결정할 수 있다. 우리는 각각의 sample coverage mask 가 1111인지 아닌지를 멀티샘플된 버퍼에 저장할 수 있다. 그리고 나서 우리가 각각이 픽셀이 complex인지 아닌지를 반복해서 할 필요없게 하기 위해서 명확하게 그 버퍼를 결정한다(resolve).
이 접근법은 complex 픽셀들을 찾는데 아주 효율적일 수 있지만 화면공간의 비연속성 보다는 기본 geometry에 의존하기 때문에 가장자리 픽셀이 아닌 것도 complex로 처리할 수 있다.
이 샘플의 다른 접근법은 픽셀에 샘플들 사이의 normal, color 그리고 depth 에서 비연속성을 찾는 것이다. 그래서 만약 비연속성이 특정 문턱값 보다 크다면, 우리는 픽셀을 complex로 결정한다. 이 접근법은 complex 픽셀이 오직 가장자리에서만 생성된다는 이점을 갖고 있다. 그러나 complex를 검출하는 동안 픽셀의 샘플을 반복해야 합니다.

Separate Pass for Complex Pixels
라이팅 패스에서, 우리는 complex pixel mask를 일반픽셀과 complex 픽셀을 구분하기 위해서 사용합니다. 만약 complex 픽셀이면 우리는 수퍼 샘플링을 수행합니다. 그리고 각 샘플의 평균을 산출한다. 이것의 문제점은 스레드 일관성입니다. 패킹되어 왜곡된 픽셀(pixels packed)에 대해, Shading을 한번만 실행하는 일반픽셀의 경우 complex 픽셀들이 수퍼 샘플링을 하는 동안 기다려야만 합니다. 다른방법으로 우리는 일반과 complex 픽셀을 스텐실 마스크를 사용하여 2개의 패스로 분리할 수 있습니다. 분리된 패스의 단점은 스텐실 마스크를 생성하는 비용과 각각의 프레임마다 추가적인 드로우콜 입니다.
이 예제는 complex 픽셀에 대해서 하드웨어 기반 수퍼 샘플링을 하는 방식을 구현했습니다. 단일 픽셀쉐이더 호출에서 여러번의 샘플링하는 Shading 방식 대신에 우리는 픽셀쉐이더를 샘플 레벨당 발생시켜 완전히 수퍼 샘플링 된 complex 픽셀을 얻습니다.
Adaptive Shading of Complex Pixels
하나 더 중요한 점은 대부분의 complex 픽셀은 2개의 Unique fragment만 포함한다는 것입니다. 이것은 잠재적으로 Complex 픽셀의 쉐이딩 수행을 줄이면서 여전히 동일한 Visual quality를 얻을 수 있습니다.

다시 한번 말하지만, 이 프로그램은 Coverage mask를 각각의 complex 픽셀의 Unique fragment 수를 계산하는데 사용한다. 우리는 픽셀당 Unique coverage mask 개수를 세고, 다루어진 샘플들 수를 사용하여 픽셀의 각각의 Unique fragment을 가중치를 둔다. 예를들어 Figure 4에서 3개의 Uniqure fragment가 있다. 빨간색 fragment는 2/4로 가중되었다. 반면에 파랑색과 회색은 fragment는 각각 1/4로 가중되었다.
이것은 Shading 비용을 절약하지만 Complex 픽셀의 Unique fragments의 계산과 가장치 부여에 추가적인 비용이 발생한다.
Acknowledgments
The Sponza model was created by Marko Dabrovic.
'Graphics > 참고자료' 카테고리의 다른 글
| [번역]Aliasing in computer graphics (0) | 2020.04.10 |
|---|---|
| [번역]Light Indexed Deferred Lighting (0) | 2020.03.23 |
| [번역]Radiometry (Steve Marschner, Cornell University) (0) | 2020.02.29 |
| [번역]Dual paraboloid shadow mapping (2) | 2020.02.15 |
| [번역]Hierarchical-Z map based occlusion culling (0) | 2020.01.30 |