Unity DOTS 인스턴싱 셰이더 가이드
개요
Unity의 DOTS 인스턴싱 셰이더는 많은 수의 인스턴스를 효율적으로 렌더링하기 위해 BatchRendererGroup (BRG)에 의해 사용되는 새로운 셰이더 인스턴싱 모드입니다. 이 방식은 GPU 성능을 향상시켜 전체적인 그래픽스 퍼포먼스를 더욱 개선합니다.
DOTS 인스턴싱의 장점
- 효율적인 데이터 관리: 인스턴스 데이터는 GraphicsBuffer에 저장되어 GPU에 지속적으로 유지됩니다. 이는 인스턴스가 변경될 때만 데이터를 설정하므로 매 프레임마다 데이터를 재설정할 필요가 없어 성능이 향상됩니다.
- 경량 드로우 콜: 드로우 콜의 작업량이 줄어들어 작성이 경량화되고 효율성이 높아집니다.
- 메모리 최적화: 기존 방법보다 더 많은 인스턴스를 더 적은 메모리로 렌더링할 수 있게 됩니다.
DOTS 인스턴싱 지원 조건
셰이더가 DOTS 인스턴싱을 지원하기 위해서는 다음 조건을 충족해야 합니다: - 셰이더 모델: 4.5 이상을 사용해야 하며, #pragma target 4.5
를 지정해야 합니다. - 키워드 지원: DOTS_INSTANCING_ON
키워드를 지원해야 하며, #pragma multi_compile _ DOTS_INSTANCING_ON
으로 선언해야 합니다. - 인스턴스화 프로퍼티 블록: 하나 이상의 프로퍼티가 있는 DOTS 인스턴스화 프로퍼티 블록을 선언해야 합니다.
DOTS 인스턴스화 프로퍼티 선언
셰이더에서는 인스턴스 데이터를 로드하기 위해 DOTS 인스턴스화 프로퍼티를 정의해야 합니다. 예를 들어:
UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
UNITY_DOTS_INSTANCED_PROP(float4, Color)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)
위의 예시에서 MaterialPropertyMetadata
라는 이름의 블록을 정의하였고, Color
라는 부동 소수점 프로퍼티를 인스턴스화 했습니다.
DOTS 인스턴스화 프로퍼티 접근
셰이더에서는 Unity에서 제공하는 여러 매크로를 사용하여 DOTS 인스턴스화 프로퍼티에 접근할 수 있습니다:
매크로 | 설명 |
---|---|
UNITY_ACCESS_DOTS_INSTANCED_PROP(PropertyType, PropertyName) |
인스턴스 데이터에서 값을 반환 |
UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(PropertyType, PropertyName) |
기본값을 반환 |
UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_CUSTOM_DEFAULT(PropertyType, PropertyName, DefaultValue) |
커스텀 기본값을 반환 |
UNITY_DOTS_INSTANCED_METADATA_NAME(PropertyType, PropertyName) |
메타데이터 값을 반환 |
예시 코드
인스턴스와 상수 데이터를 접근하는 방법입니다.
인스턴스 데이터 접근 예제
void ExamplePerInstance()
{
uint rawMetadataValue = UNITY_DOTS_INSTANCED_METADATA_NAME(float4, Color);
float4 c0 = UNITY_ACCESS_DOTS_INSTANCED_PROP(float4, Color);
float4 c1 = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4, Color);
float4 c2 = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_CUSTOM_DEFAULT(float4, Color, float4(1, 2, 3, 4));
}
상수 데이터 접근 예제
void ExampleConstant()
{
uint rawMetadataValue = UNITY_DOTS_INSTANCED_METADATA_NAME(float4, Color);
float4 c0 = UNITY_ACCESS_DOTS_INSTANCED_PROP(float4, Color);
float4 c1 = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_DEFAULT(float4, Color);
float4 c2 = UNITY_ACCESS_DOTS_INSTANCED_PROP_WITH_CUSTOM_DEFAULT(float4, Color, float4(1, 2, 3, 4));
}
요약
Unity의 DOTS 인스턴싱 셰이더를 통해 많은 수의 인스턴스를 효과적으로 관리할 수 있습니다. 이를 통해 게임의 성능과 그래픽스 품질을 향상시킬 수 있습니다. 이 가이드를 활용하여 인스턴싱 프로퍼티 선언 및 접근 방법을 보다 쉽게 이해하고 적용할 수 있습니다.