일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- C#
- 리듬게임에디터
- 1인개발
- 확장메서드
- 리듬게임
- github
- ExtensionMethod
- 인터페이스
- 게임개발
- 게임제작
- ar
- 짐벌락
- Euler
- raycast
- 로케트
- Quaternion
- 병맛게임
- AR게임
- AR세팅
- 게임
- 델리게이트
- ARProgect
- 레이캐스트
- AR Foundation
- 유니티
- callbyvalue
- 소규모프로젝트
- Unity
- 깃허브
- callbyreference
- Today
- Total
Ssssong += Dev
[유니티] BRG / DOTS Instancing 본문
문제
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
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
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 사이클 횟수를 줄일 수 있다.