UNITY_DOTS_INSTANCED_PROP マクロには 3 つのバリアントがあります。
UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED(PropertyType, PropertyName)UNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED(PropertyType, PropertyName)UNITY_DOTS_INSTANCED_PROP_OVERRIDE_REQUIRED(PropertyType, PropertyName)これらのマクロを使用すると、コンパイル時にプロパティをインスタンス化できるかどうかを指定できます。これにより、UNITY_ACCESS_DOTS_INSTANCED_PROP などのアクセスマクロをより最適なコードに拡張でき、ローエンドのプラットフォームに大きな影響を与える可能性があります。
以下は、上記のすべてのマクロバリアントを使用した DOTS Instanced プロパティブロックの例です。
UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
UNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED(float4, Color)
UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED(float4, SpecColor)
UNITY_DOTS_INSTANCED_PROP_OVERRIDE_REQUIRED(float4, EmissionColor)
UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)
Color プロパティは、インスタンス化が可能または不可能のいずれかです。プロパティのメタデータの高ビットに応じて、適切なロードパスが動的に選択されます。SpecColor プロパティはインスタンス化できません。この宣言では、定数バッファに uint32 フィールドは追加されません。何も宣言していないのと同じです。コードの他の部分を修正せずに、プロパティのインスタンス化をすばやく無効にする場合に便利です。EmissionColor プロパティはインスタンス化する必要があります。プロパティは常に unity_DOTSInstanceData バッファからロードされ、プロパティにアクセスしても動的な分岐は発行されません。デフォルトでは、UNITY_DOTS_INSTANCED_PROP は UNITY_DOTS_INSTANCED_PROP_OVERRIDE_SUPPORTED と同じです。このデフォルト動作は、“com.unity.render-pipelines.core\ShaderLibrary\UnityDOTSInstancing.hlsl” 内の define UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT のコメントを解除することで変更できます。この設定を行うと定義が有効になり、UNITY_DOTS_INSTANCED_PROP は UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED と同じになります。
ノート: define UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT のコメントを解除する際には、シェーダーが正しく再コンパイルされるように、Library フォルダーの消去が必要な場合があります。
ローエンドのデバイスでは、インスタンス化されたプロパティは、パフォーマンスコストが非常に高くなる可能性があります。例えば、SSBO からのロードは、通常の定数バッファのロードよりも大幅に遅くなる場合があります。これは、多くのローエンドデバイスはこのタイプのロードテクスチャサンプラーを通過しますが、定数バッファのロードはバッファにアクセスするために動的インデックスが使用されない限り、より高速なハードウェアを使用するためです。インスタンス化されたプロパティは、プロパティのメタデータに依存するため、常に動的インデックスでロードされます。これは、ローエンドデバイスは常にテクスチャサンプラーを通過することを意味します。ローエンドデバイス向けにプロジェクトをより適切に最適化するには、プロパティのインスタンス化をデフォルトで無効にします。これを行うには、define UNITY_DOTS_INSTANCED_PROP_OVERRIDE_DISABLED_BY_DEFAULT を有効にします。これで、プロパティのインスタンス化がデフォルトで無効に設定されます。設定が完了したら、インスタンス化が必要なプロパティのみを手動で有効にします。