Notice
Recent Posts
Recent Comments
Link
반응형
«   2026/01   »
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
Archives
Today
Total
관리 메뉴

RenderLog

DeferredRenderingMSAA 본문

Graphics/Graphics

DeferredRenderingMSAA

scahp 2020. 2. 12. 00:59

DeferredRenderingMSAA

작성일자 : 2020-02-12

최재호

 

목표

이 예제는 NVIDIA에서 제공하는 모든 내용이 동작하는 Full Source를 이미 제공

DX11 코드를 분석 후 OpenGL4.0에 적용하는 것을 목표로 함

 

DeferredRendering에서 MSAA 문제

DeferredRendering는 2 Pass로 진행된다.

  1. GBuffer 채우기 패스
  2. Lighting 패스

 

문제 해결방법(SV_Coverage)

  1. 처음 GBuffer(MultiSample 타입) 채울때 SV_Coverage(OpenGL gl_SampleMaskIn)를 사용하여 SampleCoverage 정보를 얻음.
  2. MS x4 인 경우 SV_Coverage 0xf 인 경우가 아니면 Edge. 이 정보를 GBuffer에 저장
  3. Edge 여부가 저장된 TextureResolve (MultiSample 타입 텍스쳐에서 Resolve 일반 텍스쳐로 변형)
  4. Lighting 패스에서 Resolve 된 텍스쳐의 Edge 플래그를 체크하여 0보다 크면 Edge로 판단.

 

  • SV_Coverage 방식은 실제 Geometry Edge 가 아닌 경우에도 Edge로 판단될 수 있다.

 

문제 해결방법2 (Discontinuity)

SV_Coverage 방식외여 샘플들 간의 비연속성(Discontinuity)을 사용하는 방법

  1. 아래와 같이 depth, normal, abedo의 문턱값 이상인지 여부를 체크
    1. 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)
  2. 비연속성(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번 수행하되 Weight2배로 설정해주는 방식으로 Lighting 연산을 줄여준다.

 

 

OpenGL 예제 (전/후)

 

 

 
예제코드
https://github.com/scahp/Shadows/tree/MSAA_And_Antialiasing

레퍼런스

https://scahp.tistory.com/4?category=837896

반응형

'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