3D Rendering

Deffered Render

Keisa 2023. 9. 28. 13:12

※ 디퍼드 렌더링

Forward에서 Gemetry이후 Geometry Buffer(G-Buffer)라고 부르는 씬에서 라이팅을 처리하기 위해 필요한 데이터들을 나누어 저장하는 공간에 저장한다. 각 저장공간을 모두 다 합쳐서 G-Buffer라고 부른다.

 

 

렌더링에 필요한 데이터들을 나누어 저장한다. 각 저장공간을 렌더타겟이라고 부르고 여러 개의 렌더타겟을 사용해 멀티 렌더 타겟을 사용한다고 한다. MRT(Multi Render Target)이라고 부른다.

 

 디퍼드에서는 MRT를 이용해 화면에 그려질 픽셀의 데이터를 MRT에 전부 수집한 후 라이팅 연산을 한 번에 처리한다. Forward의 경우에는 위의 설명처럼 물체마다 덧그리기를 진행하여 그리기를 시행한다.

 

First Pass

1번째 파이프라인과정에서는 GBuffer(Geometry Buffer)에 Shading에 필요한 모든 자원을 저장한다.
저장하는 Item들의 예시는 다음과 같다.

  1. pixel의 World Space좌표
  2. pixel의 diffuse color
  3. pixel의 normal값
  4. pixel의 specullar값
  5. Shading계산에 쓰이는 Light들의 World Space좌표, Color
  6. Specullar계산을 위한 Player의 위치

이 외에도 프로그래머가 원하는 만큼 데이터를 GBuffer에 저장할 수 있다.
GBuffer에 값을 저장하기 위해서는 GPU가 MRT(Multiple Render Target)기능을 하드웨어적으로 지원해야하며 그래픽스 API또한 이 기능을 지원해야 한다(DirectX 9.0이상)

 

Second Pass

2번째 파이프라인과정에서는 GBuffer에 저장된 자원들로 Shading연산을 한다.
2번째 파이프라인과정에서 Shading연산이 일어나기 때문에 Deferred라는 이름이 붙었다고 추론할 수 있다.
Second Pass는 First Pass와 다르게 단지 Pixel Shader에서 Lighting연산만 해주면 된다.
그 이유는 First Pass에서 필요한 Shading연산을 제외하고 필요한 연산을 처리해서 GBuffer에 저장하기 때문이다.



Forward의 경우에는 물체를 앞에서부터 하나씩 그려가면서 화면을 완성해가기때문에 물체마다 라이팅까지 연산이 완료된 형태를 그려주어야하는데 Deffered의 경우에는 Forward에서 라이팅 연산을 빼고 GBuffer에 각 저장공간이 요구하는 데이터를 나누어 그리고 라이팅 연산을 최대한 뒤로 미루어 연산하여 부하를 줄인것이다.

 

장점:

1. Light연산이 엄청나게 줄어든다. 그 이유는 Forward Shading에서는 한 pixel위치에 존재하는 여러개의 pixel값들에 Lighting연산을 하고

Output Merger Stage에서 depth test를 통해 한가지 pixel값만 선정해 back buffer에 그리게 되는 반면에,

Deferred Shading에서는 일단 First Pass의 Output Merger Stage에서 depth test를 통해 한 pixel위치에서 'Light 계산하게될 pixel값'을 선정하고 Second Pass에서 해당 pixel값에다가만 Light계산을 취해서 back buffer에 그리게 되기 때문이다. 한 픽셀에 여러개의 Object가 겹쳐있을 수록 Deferred Shading에서의 성능이득이 커진다고 할 수 있다.

 

단점:

1. Color Blending을 통한 투명한 Object의 렌더링이 불가능하다. 그 이유는 Forward Shading에서는 OM stage에서 한 pixel위치에서 겹치는 위치값을 가지는 pixel값들의 alpha값 비교(Color Blending)을 통해 투명한 Object렌더링이 가능하지만. Deferred Shading에서는 First Pass에서 한 pixel위치에 한가지 값으로 fix하기 위해서 다른 pixel값들을 모두 버리게 된다. 그렇기 때문에 Second Pass에서 투명한 Object를 표현할 수 없다.

2. 하드웨어적으로 지원하는 AA효과가 떨어진다. MSAA같은 anti-aliasing은 하드웨어 Rasterization단계에서 일어나게 된다.

Deferred Shading에서는 Frist Pass에서만 Rasterization이 일어난다(Second Pass는 GBuffer결과물을 사용하기만 하기 때문). 그리고, 이때 AA을 적용할 수는 있다.

하지만, Deferred Shading은 Light계산이 이루어지기 전에 AA을 적용하기 때문에 최종 결과물이 Forward Shading과 다르게 나오는 이슈가 있다. 실제 게임의 예를 들자면, 스타크래프트2가 이러한 이슈 때문에 Deferred Shading을 적용하면서 AA을 적용하지 않는다.

3. 메모리를 더 많이 먹는다. Forward Shading을 쓰면, 1개의 Back Buffer에 값을 쓰기만 하는데. Deferred Shading은 Back Buffer와 같은 해상도를 가지는 Diffuse Texture, Normal Texture, Specullar Texture등등을 다 저장해야한다.

 

'3D Rendering' 카테고리의 다른 글

TBR(Tile-based Render)  (0) 2023.09.28
Deffered Render 메모리 대역폭 문제  (0) 2023.09.28
Light Pre-Pass  (0) 2023.09.28
Forward Render  (0) 2023.09.28
Phong Shader(3D SoftRendering)  (0) 2023.09.28