새소식

그래픽

[실험] 드로우콜과 병합을 위해

  • -

드로우콜과 병합에 대한 정리[작성일 23.9.5] 옮김

실행이유
렌더링되는 배치수와 SetPassCall을 줄이기 위해

 

 

-Color Correction Lut(_Lut__ 룩업 텍스처_ 약어) 사후 효과에서 컬러 그레이딩을 최적으로 수행하는 방법입니다. 색상 보정 커브 경우처럼 커브를 통해 개별 컬러 채널을 미세 조정하는 대신 텍스처를 하나만 사용하여 보정된 이미지를 생성합니다. 룩업은 원본 이미지 컬러를 룩업 텍스처를 어드레스하는 사용되는 벡터로 사용함으로써 수행됩니다.

 

-Screen Space Ambient Occlusion (SSAO) 이미지 이펙트는 실시간으로 앰비언트 오클루전을 이미지 포스트 프로세싱 효과로서 재현합니다. 서로 인접한 주름, 구멍, 표면을 어둡게 만듭니다. 현실에서 이러한 영역은 주변광을 차단하거나 막으므로, 어둡게 보입니다. 세부 정보

SSAO는 이미지 프로세싱 효과를 통해 앰비언트 오클루전을 재현합니다. 처리 부하는 화면 해상도와 SSAO 파라미터에만 관련이 있으며, 실제 AO의 경우와는 달리 씬 복잡도와는 관련이 없습니다. 하지만 재현 과정에서 결함이 추가되곤 합니다. 예를 들어, 화면 외부에 포지션한 오브젝트는 오클루전에 포함되지 않으며, 오클루전의 정도는 보는 각도와 카메라 위치에 따라 달라집니다.

SSAO는 처리 시간을 일반적으로 많이 요구하므로, 하이엔드 그래픽스 카드에서만 사용해야 합니다. SSAO를 사용하면 Unity가 카메라의 뎁스와 노멀 텍스처를 렌더링하게 되어, 드로우 콜 수를 증가시켜 CPU 처리 부하를 증가시키게 됩니다. 하지만, 뎁스와 노멀 덱스처는 피사계심도 등과 같은 효과에도 사용할 수 있습니다. 텍스처를 생성하면, SSAO 나머지 효과는 그래픽스 카드에서 수행됩니다.

 

 

[출처]https://www.youtube.com/live/UsyvT36vqpU?si=kK-SHb1cpAH6LobU

SetPassCall :

실제사용되는 쉐이더의 변경으로 발생하는 횟수[그래픽 카드에서 사용하는 값들]

쉐이더가 사용하는 값(식)이 동일한[같은 쉐이더] 오브젝트끼리의 Draw된다면, GPU 부하가 감소한다.

동일한 오브젝트를 하나의 SetPass에 처리하게 된다면, 그만큼 Batches도 줄어들게 된다.

 

 

 

 

큐브 1

기본 배치 7 에서 3증가 : [ShadowMap : 1 / Depth : 1 / Opaque :1 ]를 한번씩 그리기에 Batches가 증가함.

 

 

쉐이더 3개를 포하는 오브젝트 1개 추가

변경점 :

n   배치 : 7 -> 16

n   SetPassCall : 7 -> 11

n   MainLight Shadow 3개 : 쉐이더 3개에 해당하는 부분의 그림자를 그린다.

n   DepthNomal : 쉐이더 3개에 해당하는 깊이 노말맵을 그린다.

n   Opaque : 3개 | 서로 다른 쉐이더 키워드를 사용하기 때문에, 1, 2개 각각 드로우

-       [한 오브젝트에 다른 키워드를 사용하는 쉐이더가 존재한다면, 같은 것끼리 묶어서 그린다.]

 

n   SetPassCall

-       실직적으로 3개가 추가 되는게 맞으나, 키워드가 상이하여 쉐이더의 변경이 일어나 따로 처리

 

 

 

위 오브젝트를 2개로 증가

n   배치 : 16 -> 25

n   SetPassCall : 11

동일한 오브젝트에 대해서 같은 Shader를 사용하는 부분에 대해서 SetPass가 증가하지 않는다.

 

 

 

메쉬 병합에 대해

 

2개의 오브젝트에 대한 병합 결과[위 1개의 오브젝트 추가 결과에서 TransparentObject가 추가됨.]

batches : 17[15 -> 17]  | 유리 메쉬 2개 만큼 증가

SetPass : 12 [11 -> 12] | 유리 쉐이더 1개만큼 증가

 

배치는 1개 때와 동일하다는 결론이 나왔음.

 

-       쉐이더의 키워드가 달라 같이 그릴 수 없는 쉐이더의 경우 같은 키워드를 가진 'A,B' 와 같이 처리할 수 없으며, ' Glass' 쉐이더 같은 경우  Batch +2[창문의 개수] setPass + 1이 증가하게 되었다.

-       하지만, 창문[ Glass ] 같은 경우 같은 쉐이더를 사용하기 때문에, 실질적인 SetPassCall은 1 증가하게 된다.

 

도달. 쉐이더의 키워드가 동일하다면, 묶여있는 메쉬끼리로 배치가 이루어진다.

 

 

 

키워드 분류 병합과 그냥 병합

 

차이점
  setPass Batches
그냥 22 48
분류 20 43

-    통합과 다르게 키워드에 따라 분류를 하게 되었을 때, 분류한 데이터를 기반으로 플레이어의 뒤쪽 180도 범위는 Draw가 발생하지 않음.

- 아래에 결과 사진 1 | 2를   비교한다면, 1 은 한번에 병합되어 불필요한 창문정보까지 그리는 반면,  2 의 결과를 보면 뒤에 분류되어 병합된 창문들은 그러지지 않아 Bathes가 4정도 감소함을 확인할 수 있다.

 

1.그냥 병합

 

2.분류 병합

 

 

 

 

 

[추가적인 정리]

메쉬 통합을 한다면 단일 오브젝트에서는 큰 차이가 없겠지만, 여러 오브젝트가 존재하는 경우 통합된 오브젝트 사이에서 쉐이더의 차이가 발생해서, 통합된 메쉬 사이에서도 SetPass가 카운트되며 GPU에 부하를 준다.

 

[관련 글]

https://krapboss.tistory.com/m/21

Contents

아핫

땡큐하다