Ssssong += Dev

[유니티] BRG / DOTS Instancing 본문

카테고리 없음

[유니티] BRG / DOTS Instancing

ssong_dev 2022. 12. 7. 18:11

문제

LitShader 커스텀 중 프로퍼티 선언 부분에서 UNITY_DOTS_INSTANCING 을 사용하고 있어 어떤 기능인지 알아보았다.

 

#ifdef UNITY_DOTS_INSTANCING_ENABLED
UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
UNITY_DOTS_INSTANCED_PROP(float4, _BaseColor)
    //...중간 생략
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)

#define _BaseColor  UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO(float4 , Metadata_BaseColor)

#endif

 

이런 식으로 선언되어 있다.

 

https://docs.unity3d.com/2022.2/Documentation/Manual/batch-renderer-group.html

 

Unity - Manual: BatchRendererGroup

Scriptable Render Pipeline Batcher How BatchRendererGroup works BatchRendererGroup BatchRendererGroup (BRG) is an API for high-performance custom rendering in projects that use a Scriptable Render Pipeline (SRP) and the SRP Batcher. BRG is the perfect tool

docs.unity3d.com

BatchRendererGroup

-> an API for high-performance custom rendering in projects that use a Scriptable Render Pipeline(SRP) and SRP Batcher

 

* Render DOTS Entities

* Render a large number of environment objects where using individual GameObjects would be too resource-intensive.

Ex) procedurally-placed plants or rocks.

* Render custom terrain patches. 

= 리소스가 무거워질 수 있는 많은 오브젝트를 렌더할 때 사용되는 API이다. SRP batcher를 사용한다.

 

 

How BatchRendererGroup works

 

BRG는 유니티 최적화를 위한 draw command를 생산한다. BRG는 draw command의 인스턴스를 언제 그릴 지 결정하기 위해 filter setting을 사용하는데, 이 Filter setting을 통해 인스턴스들이 언제 렌더되고 각 인스턴스들이 가진 특정 facet(모션이나 벡터 등)들이 언제 렌더될 지 조절한다.

 

같은 Filter setting들이 수많은 draw command에 사용될 수 있기에 BRG는 draw range를 통해 draw command들의 범위에 filter setting을 적용한다. draw range는 filter setting이 유니티가 그리지 말아야 할 것을 지정할 때에 특히 유용하다. 유니티가 그려지지 않을 draw command 범위를 효율적으로 스킵할 수 있게 한다.

 

 

https://docs.unity3d.com/2022.2/Documentation/Manual/dots-instancing-shaders.html

 

Unity - Manual: DOTS Instancing shaders

The Rendering Statistics window DOTS Instancing shaders To render large instance counts efficiently, BRG uses a new shaderA program that runs on the GPU. More infoSee in Glossary instancing mode called DOTS Instancing. Every shader that BRG uses must suppo

docs.unity3d.com

DOTS Instancing shaders

DOTS Instanced shader에서는 유니티는 32bit integer를 통해 셰이더에 접근하여 DOTS Instanced property에 접근할 수 있다. 기존 셰이더에서 각각 인스턴스화된 배열로 접근해야 하는 것과 다르다. 이 32bit integer를 metadata value라고 한다. 이 integer로는 특히 퍼버 오프셋을 나타내는데 해당 셰이더가 그리는 인스턴스의 프로퍼티 데이터 위치를 나타낸다.

 

DOTS Instancing shader에는 여러 장점이 있는데

* 인스턴스 데이터를 GraphicsBuffer에 넣어둬 GPU에 계속 남아있게 함으로써 유니티가 인스턴스를 렌더하는 매번 다시 세팅하지 않아도 된다. 데이터를 인스턴스가 변화할 때에만 세팅함으로써 데이터가 거의 변하지 않을 때에는 퍼포먼스 향상을 기대할 수 있다.

* 인스턴스 데이터를 세팅하는 과정이 드로우콜을 세팅하는 것과 분리되어 있다. 이로써 드로우콜을 가볍고 효율적으로 만든다. BRG는 SRP Batcher가 각 드로우콜마다 약간씩만 변화를 주는 path를 통해서 가능토록 한다. (오잉 이건 어떻게...?) 이 과정을 responsibility를 사용자에게 넘겨 각 드로우콜에 대한 컨트롤을 할 수 있게 된다.

* 드로우콜의 사이즈는 더이상 contant 혹은 uniform 버퍼에 넣을 수 있는 인스턴스 데이터에 제한되지 않는다. 따라서 BRG로 하여금 larger instance counts를 각 드로우콜에 렌더할 수 있도록 한다. (각 인스턴스 인덱스들은 여전히 드로우콜 사이즈를 제한한다. 각 인덱스는 여전히 데이터를 요구하기 때문이다. 하지만 각 인덱스는 훨씬 적은 양의 메모리를 소비하고 더 많은 인스턴스들이 constant 혹은 uniform 버퍼에 들어갈 수 있게 된다.) 

* 만약 모든 인스턴스가 주어진 프로퍼티에 대해 같은 값을 사용하고 있다면 모든 인스턴스들이 메모리의 같은 주소에서 값을 불러오는 것이 가능하다. 이것은 메모리와 각 인스턴스에 대해 값을 복사하는 GPU 사이클 횟수를 줄일 수 있다.