Notice
Recent Posts
Recent Comments
Link
반응형
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- RayTracing
- DirectX12
- 번역
- hzb
- GPU Driven Rendering
- optimization
- vulkan
- shader
- scalar
- rendering
- ShadowMap
- UE5
- wave
- SGPR
- VGPR
- texture
- Nanite
- deferred
- Study
- atmospheric
- Graphics
- ue4
- Shadow
- Wavefront
- scattering
- unrealengine
- forward
- DX12
- GPU
- SIMD
Archives
- Today
- Total
RenderLog
DeferredRenderingMSAA 본문
DeferredRenderingMSAA
작성일자 : 2020-02-12
최재호
목표
이 예제는 NVIDIA에서 제공하는 모든 내용이 동작하는 Full Source를 이미 제공
DX11 코드를 분석 후 OpenGL4.0에 적용하는 것을 목표로 함
DeferredRendering에서 MSAA 문제
DeferredRendering는 2 Pass로 진행된다.
- GBuffer 채우기 패스
- Lighting 패스
문제 해결방법(SV_Coverage)
- 처음 GBuffer(MultiSample 타입) 채울때 SV_Coverage(OpenGL은 gl_SampleMaskIn)를 사용하여 SampleCoverage 정보를 얻음.
- MS x4 인 경우 SV_Coverage는 0xf 인 경우가 아니면 Edge임. 이 정보를 GBuffer에 저장
- Edge 여부가 저장된 Texture를 Resolve 함(MultiSample 타입 텍스쳐에서 Resolve 일반 텍스쳐로 변형)
- Lighting 패스에서 Resolve 된 텍스쳐의 Edge 플래그를 체크하여 0보다 크면 Edge로 판단.
- SV_Coverage 방식은 실제 Geometry Edge 가 아닌 경우에도 Edge로 판단될 수 있다.
문제 해결방법2 (Discontinuity)
SV_Coverage 방식외여 샘플들 간의 비연속성(Discontinuity)을 사용하는 방법
- 아래와 같이 depth, normal, abedo의 문턱값 이상인지 여부를 체크
- if(abs(depth - nextDepth) > 0.1f || abs(dot(abs(normal - nextNormal), float3(1, 1, 1))) > 0.1f || abs(dot(albedo - nextAlbedo, float3(1, 1, 1))) > 0.1f)
- 비연속성(Discontinuity)을 사용하는 경우 Edge 플래그가 저장된 텍스쳐를 Resolve 할 필요 없음.
- 성능은 SV_Coverage를 사용하는 것이 더 빠르지만 정확도는 Geometry의 비연속성 정보를 사용하는 것이 더 나음
기타사항
GPU의 Thread Coherency를 위해서 NormalPixel과 ComplexPixel을 2패스로 나눠서 처리하기도 함.
그렇게 하기위해서는 스텐실 버퍼에 NormalPixel경우 1 ComplexPixel의 경우 0을 기록하고, 각 각패스의 StencilRef 값을 0, 1 로 설정하여 차례로 2패스를 렌더링 함.
추가 성능 개선 (Adaptive Shading of Complex Pixels)
- Complex Pixel에서 같은 프리미티브 아이디(마스크)를 제거하여 Lighting 연산 횟수를 줄여줄 수 있는 기능
- 아래와 같이 SV_Coverage 플래그가 동일한 경우, 해당 샘플은 1번 수행하되 Weight를 2배로 설정해주는 방식으로 Lighting 연산을 줄여준다.



OpenGL 예제 (전/후)


예제코드
https://github.com/scahp/Shadows/tree/MSAA_And_Antialiasing
레퍼런스
반응형
'Graphics > Graphics' 카테고리의 다른 글
| Light Indexed Deferred Rendering (0) | 2020.04.03 |
|---|---|
| Tangent Space, Tanget Vector 생성 (0) | 2020.03.28 |
| DeepShadowMap(DSM) (0) | 2020.02.25 |
| Dual Paraboloid ShadowMap (0) | 2020.02.18 |
| Hi-Z Occlusion Culling (3) | 2020.02.04 |