기본적으로 Unity GPU는 각 인스턴스화된 드로우 콜에서 다른 트랜스폼의 게임 오브젝트를 인스턴스화합니다. 인스턴스에 배리에이션을 더 추가하려면 Color와 같은 인스턴스당 프로퍼티를 추가하도록 셰이더를 수정합니다. 표면 셰이더 및 버텍스/프래그먼트 셰이더 모두에서 이 작업을 수행할 수 있습니다.
커스텀 셰이더는 인스턴스당 데이터가 필요하지 않지만, 월드 매트릭스가 올바르게 작동하려면 인스턴스 ID가 필요합니다. 표면 셰이더는 인스턴스 ID를 자동으로 설정하지만 커스텀 버텍스 및 프래그먼트 셰이더는 설정하지 않습니다. 커스텀 버텍스 및 프래그먼트 셰이더의 ID를 설정하려면 셰이더의 시작 부분에서 UNITY_SETUP_INSTANCE_ID를 사용합니다. 이를 수행하는 방법에 대한 예시는 버텍스 및 프래그먼트 셰이더를 참조하십시오.
인스턴스화된 프로퍼티를 선언하면 Unity는 게임 오브젝트에 설정된 MaterialPropertyBlock 오브젝트에서 모든 프로퍼티 값을 수집하여 하나의 드로우 콜에 넣습니다. MaterialPropertyBlock 오브젝트를 사용하여 런타임 시 인스턴스당 데이터를 설정하는 방법에 대한 예시는 런타임 시 인스턴스당 데이터 변경을 참조하십시오.
멀티 패스 셰이더에 인스턴스당 데이터를 추가할 때 다음 사항에 유의하십시오.
여러 개의 인스턴스당 프로퍼티를 사용하는 경우 MaterialPropertyBlock 오브젝트에 모든 프로퍼티를 채울 필요가 없습니다. 또한 인스턴스에 프로퍼티가 없는 경우 Unity는 참조된 머티리얼에서 기본값을 가져옵니다. 머티리얼에 프로퍼티에 대한 기본값이 없는 경우 Unity는 해당 값을 0으로 설정합니다. 인스턴스화되지 않은 프로퍼티를 MaterialPropertyBlock에 넣지 마십시오. 인스턴싱이 비활성화됩니다. 대신 다른 머티리얼을 만들어야 합니다.