트랜스폼 매트릭스와 같은 인스턴스 데이터를 로드하려면 셰이더에 DOTS 인스턴스화 프로퍼티를 정의해야 합니다. 다음은 간단한 DOTS 인스턴스화 프로퍼티 블록 예시입니다.
UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
UNITY_DOTS_INSTANCED_PROP(float4, Color)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)
프로퍼티 블록의 시작과 끝을 표시하려면 블록 이름 뒤에 있는 UNITY_DOTS_INSTANCING_START 및 UNITY_DOTS_INSTANCING_END 매크로를 사용합니다. 이 예시에서는 이름 MaterialPropertyMetadata를 사용합니다. 다음 세 가지 블록 이름이 허용됩니다.
셰이더는 각 블록 중 하나를 선언할 수 있으므로 DOTS 인스턴스화 셰이더에는 0–3개의 블록이 있을 수 있습니다. Unity 정의 셰이더 코드는 UserPropertyMetadata를 사용하지 않으므로 이 이름은 무료로 사용할 수 있습니다. URP와 HDRP는 제공하는 모든 셰이더에 BuiltinPropertyMetadata를 정의하고, 대부분의 셰이더에 대해 MaterialPropertyMetadata도 정의하므로 UserPropertyMetadata를 사용하는 것이 가장 좋습니다. 커스텀 셰이더는 사용 가능한 세 가지 이름을 모두 한 번에 사용할 수 있습니다.
블록에는 다음과 같은 형식의 DOTS 인스턴스화 프로퍼티 정의를 얼마든지 포함할 수 있습니다.
UNITY_DOTS_INSTANCED_PROP(PropertyType, PropertyName)
PropertyType은 부울 벡터를 제외하고 모든 HLSL 빌트인 유형(예: uint, float4, float4x4, int2x4)일 수 있으며, PropertyName은 DOTS 인스턴스화 프로퍼티의 이름입니다. DOTS 인스턴스화 프로퍼티는 일반 머티리얼 프로퍼티와 완전히 분리되어 있으며, 다른 일반 머티리얼 프로퍼티와 동일한 이름을 지정할 수 있습니다. 이는 UNITY_DOTS_INSTANCED_PROP 매크로가 다른 프로퍼티 이름과 충돌하지 않는, Unity가 인식하는 특수 상수 이름을 생성하므로 가능합니다. Unity가 제공하는 셰이더는 DOTS 인스턴스화 프로퍼티에 일반 머티리얼 프로퍼티와 동일한 이름을 부여하지만 이 규칙을 따르지 않아도 됩니다.
내부적으로 Unity는 셰이더가 선언하는 모든 DOTS 인스턴스화 프로퍼티에 대해 셰이더에 32비트 정수 메타데이터 값을 제공합니다. Unity는 코드가 BatchRendererGroup.AddBatch 호출을 수행하여 드로우와 연결된 배치를 생성할 때 메타데이터 값을 설정합니다. Unity가 설정하지 않은 경우 메타데이터 값은 기본값인 0입니다. 셰이더는 Unity가 BatchRendererGroup.AddBatch에 인수로 전달하는 GraphicsBuffer에 설정하는 ByteAddressBuffer unity_DOTSInstanceData에 액세스할 수도 있습니다. 일반적으로 이 버퍼는 셰이더가 인스턴스 데이터를 로드하는 위치입니다. 여러 배치가 하나의 GraphicsBuffer를 공유할 수 있지만, 각 배치에서 unity_DOTSInstanceData에 대해 별도의 GraphicsBuffer를 사용할 수도 있습니다.
참고: Unity는 DOTS 인스턴스화 데이터를 자동으로 제공하지 않습니다. 각 배치의 unity_DOTSInstanceData 버퍼에 올바른 데이터가 포함되어 있는지 확인하는 것은 사용자의 책임입니다. 인스턴스 데이터에는 Unity가 일반적으로 게임 오브젝트에 제공하는 여러 프로퍼티(예: 트랜스폼 매트릭스, 라이트 프로브 계수, 라이트맵 텍스처 좌표)가 포함되어야 합니다.