2020 이전/DirectX

스텐실 버퍼를 이용한 라이트 볼륨 디퍼드 렌더링

이상해C++ 2019. 6. 5. 15:49

디퍼드 렌더링. 다수의 광원을 처리하기 위해서 효율성을 위해 GBuffer(Albedo, Normal, Depth, Material)를 만들고 그 위에 라이팅을 처리한다. 

 

문제점. 각 조명을 리스트를 돌면서 전체 픽셀에 대해서 체크한다는것

점광같은 경우, 빛의 영향을 주는 범위를 r이라고 했을때 파란색 영역은 빛이 닿지 않음에도 일단 픽셀셰이더로 들어가게 된다는 단점이 있다. 이것을 개선하기 위한 방법 중 하나인 Tiled deferred shading은 화면을 타일로 나누어 타일별 조명 리스트를 작성하여 타일별로 처리하는 방법이다. 하지만 렌더하기전 매 프레임 각 타일별 조명 리스트를 작성을 요구한다. 

 

light volume with deferred rendering

라이트 볼륨 디퍼드 셰이딩은 각 라이트에 볼륨(해당 광원이 영향을 주는 범위)을 가정하여 그 라이트 볼륨 메쉬에만 셰이딩을 처리하는 방법이다. 이 라이트 볼륨은 자신(광원)이 영향을 주는 범위의 fragment만 쓰게된다. 

 

 

가상의 볼륨 "메쉬"기 때문에 인스턴싱을 사용할 수 도 있다. 이 볼륨 라이팅을 처리할때는 depth write를 꺼야하고 additive blending을 켜야한다. 라이트 볼륨은 실제 기하구조(geometry)가 아니므로 depth를 쓸 수 없어야하고 additive를 끄는 것은 두 개 이상의 빛 볼륨이 겹치는 경우, 마지막에 렌더한 빛 볼륨이 이 전에 픽셀에 칠했던 광원들을 덮어쓰는 것을 방지해야 한기 때문이다. 빛이 여러개 겹치면 밝으니까. 

 

일단 볼륨 메쉬를 렌더링하게되면 백페이스 컬링도 문제가 된다. 백페이스 컬링을 끄면 광원 메쉬 뒷면은 컬링되기 때문에 광원에 접근하면 어느순간 화면이 어두워진다. 그래서 백페이스 컬링을 키면 문제가 되는것이 두배로 밝아지는 픽셀이 존재한다. 이 상황은 front face culling으로 해결할 수 있지만 여전히 불만족스럽다. 물체에 빛이 닿는다해도 내 눈(카메라)에 보이지 않는 부분을 굳이 연산할 필요가 있을가?

 

Rendering deferred lights using Stencil culling algorithm : https://kayru.org/articles/deferred-stencil/

 

Rendering deferred lights using Stencil culling algorithm

Rendering deferred lights using Stencil culling algorithm Yuriy O'Donnell, March 14th, 2009 Updated July 12, 2011 This algorithm works for all lights regardless of whether camera is inside the light volume or not. However, it will only work well on PC hard

kayru.org

1pass : front face를 테스트할 때, 광원이 가려지고 있다면 pixel를 셰이딩하지 않는 것이므로 프론트 페이스를 렌더링(color buffer disable)할때 스텐실 버퍼에 z판정을 실패한 fragment에 대해서 non-zero value를 채운다. 이때는 뎁스 테스트를 통한 스텐실 버퍼에만 값을 채우는 과정.

 

2pass : 빛의 back face를 렌더링(이제 실제로 빛의 색을 연산할 차례) 할 때, 1pass에서 스텐실에 0(z 테스트 통과)이 기록된 픽셀에 대해서 다시 depth테스트를 실행, 광원이 씬의 기하구조 앞에 위치하고있고 빛의 영향을 받는다면 라이트 shading 처리를 한다. 

 

 

파란색: 1pass Z테스트 통과

빨간색: 2pass Z테스트 통과

초록색: 2pass의 Z 테스트 통과한 픽셀 중에서도 1pass의 스텐실 테스트를 통과한 친구들(실제 셰이딩 되는 fragment)

 

이 방법은 각 라이트에 대해서 RederState변경(Backface cull to Frontface cull)이 요구되기 때문에 배칭처리가 힘듬. 

배칭: https://www.slideshare.net/ozlael/unite-seoul-2016-60714130

 

z test를 통해서만 라이트 볼륨을 렌더하는 방법은 정교하지 않다.

 

참고:

https://dqlin.xyz/tech/2018/01/02/stencil/

 

Stencil Buffer Trick for Volume Deferred Shading - Daqi's Blog

Deferred shading have been known to largely boost the efficiency of rendering when treating a large amount of lights. The mechanism is very simple: separate the geometry complexity from lighting. To do this, G-buffers which form an array of textures, often

dqlin.xyz

https://www.slideshare.net/cagetu/kgc2012-deferred-forward

 

[Kgc2012] deferred forward 이창희

KGC12 발표자료입니다. http://cagetu.egloos.com으로

www.slideshare.net