IT 이모저모

Tiled Forward Shading - GPU Pro 4.1

exien 2018. 3. 5. 15:18

4.1 소개

 

이번 챕터에서는 tiled forward 셰이딩 알고리듬에 대해 살펴 볼것이다. tiled forward 셰이딩은 tiled deferred 셰이딩의 연장선(확장 or 수정)이다. [Balestra and Engstad 08, Swoboda 09, Andersson 09,Laurizen 10, Olsson and Assarsson 11]은 전통적인 디퍼드 셰이딩 방법을 향상 시켰다.

 

디퍼드 셰이딩은 2가지의 주요 특징이 있다. 라이팅 연산의 수가 지오메트리에 상관없이 최소한의 연산으 수행으로 라이팅을 계산할 수 있다. 일반적으로 지오메트리에 간단한 셰이더 리소스를 제출하는게 효율 적이었다. 하지만 현세대의 GPU는 더적은 영향을 받게되서 좀더 복잡한 셰이더 연산이 가능하다. uniform buffer를 지원해서 좀더 복잡한 구조체를 GPU 메모리에 적제하는게 가능하다.

 

전통적인 forward 파이프라인은 각각의 라이트 마다 각각의 오브젝트이 라이팅 연산을 수행한다. 디퍼드 셰이딩에서는 각각의 오브젝트를 셰이딩하는 대신에 스크린 크기의 G버퍼만을 렌더링한다. 각 픽셀들은 normal, depth,position등을 표현하는 데이터를 저장한다. 그러면 라이팅 연산과 셰이딩 수행이 분리 될수 있다. 그렇게 되면 G버퍼의 데이터를 읽어와서 라이트의 영역만을 렌더링하여 최종 버퍼에 블렌딩하므로써 라이티이 연산이 수행 될 수 있다. 그렇게되면 라이팅 연산은 최소한이 되게 된다.

 디퍼드 셰이딩은 라이팅 연산을 위해 많은 양의 계산을 줄여주게된다. 그러나 많은 메모리와 대여폭이 요구된다. tiled 디퍼드 셰이딩은 위의 사항이 계선이 되었지만 여전희 많은 G버퍼를 요구한다.

 

tiled forward 셰이딩은 tiled 디퍼드 렌더링의 장점이 섞여있다. 예로, 라이팅 연산의 감소와 forward 렌더링의 장점을 가지고 있다.  요구되는 메모리 또한 감소한다.(forward 렌더링에는 큰 G버퍼가 필요 없다.) 또한 투명한 오브젝트를 지원하고, 멀티 샘플링을 지원한다. 또한 오브젝트마다 다른 머테리얼이 필요하다면, 굳이 우버셰이더를 사용하지 않아도된다. 

 

4.2 개요: forward, deferred, 그리고 tiled 셰이딩

 

forward, deferred, tiled 셰이딩의 용어는 이번 챕터에서 빈번하게 등장한다. 이용어는 다양한 커뮤니티에서 다양한 의미로 사용되기때문에 정의할 필요하가 있다. 우리는 다음과 같이 정의 하기로 하자.

forward 셰이딩 : 지오메트리가 레스터라이즈 될때 라이트 연산을 같이 수행하는 렌더링. 변환 지오메트리의 버텍스 셰이더와 각각의 레스터라이즈된 프레그먼트의 최종 색깔을 계산하는것이 일치한다.

 

디퍼드 셰이딩은 위 과정이 2개로 분류 된다. 첫번째로는 지오메트리 단계이이다. 이단계에서는 forward 셰이딩과는 달리 레스터라이즈가 진행된다. 지오메트리 속성들은 지오메트리 버퍼(G버퍼)에 저장된다. 모든 지오메트리가 처리된후 추가 적인 pass로 저장된 G버퍼의 지오메트리 속성을 사용하여 라이팅이나 전체 적인 셰이딩이 진행된다.

 

두번째 패스는 매우 간단한 처리이다.

for each G-buffer sample {

sample_attr = load attributes from G-buffer

 

for each light {

color += shade ( sample_attr, light)

}

 

output pixel color;

}

 

라이트 패스는 O(N라이트 * N샘플)의 복잡도로 라이팅이 계산된다. 만약 라이트가 샘플들에 어떻게 영향을 미치는지 알수 있다면 이수를 효과적으로 줄이는데에 도움이 될것이다.

 

tiled 디퍼드 셰이딩은 N X N의 타일로 샘플들은 나눈다.( N = 32일때 특별히 효과적이었다. 그러나 특정 하드웨어나 소프트웨어 에서는 그렇지많은 않다.) 라이트들은 이타일들에 대입된다. 각각의 타일에 대해서 최대, 최소 .Z-bounds를 계산한다. 그러면 각 타일에 영향을 미치는 라이트의 수를 줄일수 있다.

 - 각 라이트 샘플 당 한번만 G버퍼를 읽음

 - 프레임 버퍼는 한번만 write됨

 - 각 라이트 마다 일반항을 계산하지 않아도 됨

 - 작업이 응집성을 가진다. 그래서 SIMD 아키텍쳐와 같은걸로 효율적으로 구현가능함

 

tiled 디퍼드 셰이딩과 디퍼드 테크닉들은 라이트의 범위를 제한해야한다. 만약 모든 라이트가 모든 씬에 영향을 미친다면 타일링해서 얻은 이익이 없어진다.

tiled 디퍼드 셰이딩은 tiled 셰이딩에서 산출된다. tiled 셰이딩은 디퍼드 와 forward 변종을 포함한다.

기본적은 tiled 셰이딩 알고리즘은 다음과 같다.

 

 1. 씬을 타일로 나눈다.

 2. 옵션 : 각 타일의 Z 최대, 최소 값을 찾는다.

 3. 각 타일에 영향을 미치는 라이트를 찾는다.

 4. 각 샘플마다 : 현재 샘플의 타일에 영향을 미치는 모든 라이트에 대해 라이팅 계산을 한다.

 

만약 일반적인 N X N 타일을 사용한다면, 1 번 단계는 거의 부하가 없다. 각 타일의 최대, 최소 Z -bounds를 찾는다. 예를들어, top-down 뷰의 씬은 낮은 depth 복잡도를 가져서 z방향으로 라이트가 추가적으로 컬링 될수 있다. 하지만 이 이익은 타일의 Z-bounds가 더 작을때, 빛이 영향을 미치는 범위보다.

tiled 디퍼드 셰이딩은 4번째 단계에서 G 버퍼에서 fetch된다. tiled forward 셰이딩에서는, 샘플이 라스터라이징 될때 계산되어진다. 나중에 이것에 대해 살펴볼것이다.

우리는 최근에 clustered 셰이딩이라는 tiled 셰이딩의 확장을 발표 했다. Clustered 셰이딩은 타일 셰이딩의 확장이다, 이것은 좀더 복잡한 라이트와 지오메트리 배치를 다른다.  하지만, tiled forward 셰이딩은 좀더 구현이 간단하고, 하드웨어에 좀더 친화 적이다. 우리는 clustered 셰이딩을 어떻게 확장 시킬 것인지에 대해 논의했고, 어떻게 tiled forward 셰이딩에 적용할지를 논의했다.

 

4.3 왜 tiled forward 셰이딩인가?

 디퍼드 테크닉의 주요 요점은 over - draw으로 인한 over - 셰이딩을 제거하는 것이다. 하지만 대부분의 디퍼드 테크닉은 forward 테크닉과 비교해서 다음과 같은 단점이 있다.

 - G 버퍼는 샘플당 하나의 포지션만을 저장할수 잇어서 반투명한 오브젝트는 다루기 힘들다.

 - 많은 메모리와 대역폭이 요구되고, MSAA와 같은 기술을 사용하기 쉽지 않다.

 

반면에 forward 렌더링은 쉽게 지원한다.

 - 반투명 물체의 블렌딩

 - MSAA와 관련된 기술을 하드웨어 지원을 받을수 있다.(더적은 메모리가 요구됨)

 

게다가, forward렌더링은 각 오브젝트별로 다른 셰이더, 메터리얼을 적용할수 있다. 디퍼드 테크닉은 일반적으로 우버셰이더가 필요하다. 

tiled forward 셰이딩은 적은 GPU자원이 필요하다. 이것은 tiled forward 렌더러를 컴퓨트 셰이더나, 최신 GPU기술을 사용하지 않아도 구현가능하다는 이야기이다. 사실 tiled forward 렌더러는 어떤 하드웨어에서든지 구현이 가능하다. 프래그먼트 셰이더의 텍스쳐 룩업을 지원한다면. 반면에 컴퓨트 셰이더를 사용가능하다면 타일에 영향을 미치는 라이트를 찾는일을 좀더 빠르게 할수 있다.