베개발

[엔진심화] 04. SRP Batcher ,Keyword+ Shader graph Properties 본문

대학교 공부

[엔진심화] 04. SRP Batcher ,Keyword+ Shader graph Properties

rusal0204 2021. 4. 21. 22:36

 

목차

  • Shader graph Properties
    - Property 상세 설정

  • SRP Batcher, Keyword

 


■ Shader graph Properties

1. Property 상세 설정

 



Name

에디터에서 보이는 이름

 

Reference

셰이더 코드 내부에서 사용되는 실제 변수이며, 협업 시 해당 이름을 통일해서 사용해야 하므로 주의깊게 결정하고 반드시 준수해야 한다.

_MainTex, _AlphaTex, _Color 등으로 앞에 _를 붙여서 자주 사용한다고 한다.
이름 변경시 블랙보드 프로퍼티 우클릭으로 다시 설정할 수 있다.

Default

아무런 수정도 하지 않았을 때의 기본 값을 뜻한다.

Mode

Default, Slider, Integer, Enum이 있는데 Default의 경우 기존에 쓰던것과 같이 수를 직접 입력하는 것이고, Slider는 Min과 Max값을 정해서 슬라이더를 이용해서 에디터에서 편하게 조작이 가능하다.
Integer는 정수값으로만 설정이 된다고 하는데 잘 쓰진 않는다고 한다.


Precision
- 셰이더 데이터 타입과 정밀도

정밀도란:
값이 커질수록 소수점 이하 정밀도가 작아진다. (소수점 아래가 진짜 값과 조금씩 오차가 생긴다고 생각하면 됨)

컬러 값 같은 것들은 적당히 낮은 정밀도로도 충분하다고 판단이 되면 half를 써도 된다.
(무조건은 아니고 상황에 따라 다르다는 것.)


float(single)

32비트. 매우 높은 정밀도이다.

일반적인 프로그래밍 언어에서 float 정밀도와 같다고 한다.

버텍스의 월드 포지션이나 UV좌표에 주로 사용하는 정밀도이다.

Inherit은 승계받다 라는 뜻인데,

앞에서 사용한 정밀도를 이어받는다는 뜻이다.

맨 처음에 어딘가에서 정밀도를 선언해야 하는데, 여기서 Inherit을 쓴다면 Graph Inspector에서의 Graph Settings에서 Default로 정밀도 값을 설정해둔 것을 사용한다는 것이다.

 

 

Exposed

Exposed는 블랙보드의 해당 변수가 유니티 에디터상에 노출되는지 아닌지의 여부를 결정하는 것이다.

Exposed를 끔으로써 해당 변수가 유니티 에디터상에 노출되지 않도록 할 수 있다.

 

 

SRP Batcher, Keyword

 

Keyword

Keyword 하위에 있는 요소들(Boolean, Enum)은 셰이더의 '정적 분기'를 위한 노드라고 한다.

경우에 따라서 출력되는 게 다른 상황에서, 셰이더의 Variant를 만들어내기 위해서 나온 기능이다.

간단히 말해서, 나뉘는 경우의 수마다 다른 셰이더로 쳐 진다.

이런 경우 렌더링 전 단계에서 이것저것 불러와서 렌더링하기 위한 과정을 거치는데, 그 불러오는 과정이 훨씬 길어지게 된다.

즉, 같은 머테리얼에서 분기를 나누지 않고 텍스쳐 혹은 변수만 바꾸는 것이 효율적일 수도 있다는 것이다.

* 물론 상황에 맞게 잘 쓰는 것이 중요하다.

 

이건 SRP Batcher를 통해서 쉽게 알아볼 수 있다.

 

SRP Batcher

blogs.unity3d.com/kr/2019/02/28/srp-batcher-speed-up-your-rendering/

 

SRP Batcher: Speed up your rendering!SRP Batcher로 렌더링 속도 개선SRP Batcher:レンダリングをスピードアッ

In 2018, we’ve introduced a highly customizable rendering technology we call Scriptable Render Pipeline (SRP). A part of this is a new low-level engine rendering loop called SRP Batcher that can speed up your CPU during rendering by 1.2x to 4x, depending

blogs.unity3d.com

유니티 SRP부터 추가된 기능이며, 렌더링 속도를 훨씬 빠르게 해 준다.

 

 

유니티 공식 블로그에 올라와있는 동영상.. 신기해서 가져왔다

영상을 보면 SRP Batcher를 켰을 때와 껐을 때, 렌더링 속도가 약 3배가량 차이가 난다.

 

정확히 말하자면 SetPassCall 이라는 걸 줄여주는데, 이 SetPassCall이라는 것은 Batching 이라는 것과 관련이 있다.

천천히 설명해보자면 다음과 같다.

Batching 은 무언가를 화면상에 그리기 위해서 엔진 내에서 일정한 작업을 수행하는 것을 말한다.

먼저 화면 위에 버텍스를 그리고, 그 다음 머테리얼을 가져와서 그걸 또 그리고.. 등등

그런 작업들을 CPU에서 GPU 로 전달하는 과정 중 하나가 Set Pass Call이다.

아래 사진을 보면 이해가 쉽다.

출처: 유니티 코리아 유튜브

드로우콜이라는 건 수많은 명령들중 하나이고, 그것과 비슷한 다른 명령들을 묶어서 Set Pass Call이라고 부른다.

 

저 명령들을 묶어둔 이유는 저 4가지가 GPU에 부하를 많이 주는 것이기 때문이고, 따라서 최적화를 위해서는 Set Pass Call을 줄여야 한다.

SRP Batcher가 Set Pass Call을 줄이는 데 많은 기여를 해 준다고 한다.

 

위 씬에서 쓰인 머테리얼은 총 2개이며 같은 머테리얼을 사용했다.

 

SRP Batcher를 끈 상태로 씬의 Set Pass Call을 본다면

28이 나온다.

 

반대로, SRP Batcher를 키고 Set Pass Call을 확인해보면

27이 나온다.

 

체크무늬 머테리얼과 별무늬 머테리얼이 SRP Batcher를 키기 전에는 각각으로 세어서, 2가지를 사용한 것으로 계산했었지만, SRP Batcher를 끄고 나서는 두 개가 한 가지로 계산되어서 결과적으로 SetPass call이 1 감소한 것이다.

 

 

그렇다면 이제 저번 과제(2번째 글)에서도 언급됐었던 Keyword에 관해서 알아보자.

 

각각의 옷에 Keyword로 분기점을 나눈 머테리얼을 무늬만 바꿔서 적용해보고 SetPass call을 확인한다.

Setpass call이 30으로 늘었다.

외관상 달라진건 없는데도 불구하고 말이다 (별 무늬는 좀더 예뻐보이라고 크기만 약간 조절했다. 이건 Setpass call과 관련 없는 문제다)

반면 위에서 머테리얼을 각각 사용하고, 텍스쳐를 직접 넣어서 바꿔준 건 SetPass call이 27이었다.

3개가 늘어난 이유는, 셰이더 내부에서 각각의 분기점이 나눠진 결과물(총 3가지 경우의 수가 있었다)들을 각각의 셰이더로 계산해서, 결과적으로 화면에 출력될 때 쓰이는 셰이더만 3개가 더 늘어났기 때문이다.

만약 내부에서 좀 더 분기가 나뉘기 시작했다면, 경우의 수에 따라 폭발적으로 셰이더의 갯수가 늘어났을 것이다.

 

최적화를 위해서는 머테리얼의 가짓수를 최대한 줄이고 SetPass call이 늘어나지 않도록 관리해야 할 필요가 있다.

 

청강문화산업대학교 3학년 1학기 게임그래픽엔진심화 수업 정리입니다.