Version: 6000.3
语言: 中文
在自定义着色器中访问 DOTS 实例化属性
URP中的DOTS实例化着色器示例

URP中DOTS实例化着色器的最佳实践

最佳做法是初始化所有unity_DOTSInstanceDatabuffers 设置为零,并保留未使用状态。这是因为 Unity 对批量创建期间未指定的所有元数据值使用的默认元数据值为零。具体来说,当着色器在 GPU 上运行的程序。更多信息
请参阅术语表
UNITY_ACCESS_DOTS_INSTANCED_PROP宏,着色器会从地址zero因为实例索引将被忽略。确保前 64 个字节(即最大值类型 (float4x4 矩阵)的大小)为零,可保证此类加载可预测地返回零的结果。否则,着色器可能会加载不可预测的内容,具体取决于地址零处碰巧出现的内容。

使用 DOTS 实例化时,Unity 提供的着色器图和着色器对变换矩阵使用特殊约定。为了节省 GPU 内存和带宽,他们仅使用 12 个浮点数而不是完整的 16 个浮点数来存储这些矩阵,因为四个浮点数始终是恒定的。这些着色器需要以这样一种方式格式化的浮点数,即矩阵中每列的 x、y 和 z 按顺序存储。换句话说,前三个浮点数是第一列的 x、y 和 z,接下来的三个浮点数是第二列的 x、y 和 z,依此类推。矩阵不存储w元素。这影响的变换矩阵包括:

  • unity_ObjectToWorld
  • unity_WorldToObject
  • unity_MatrixPreviousM
  • unity_MatrixPreviousMI

以下代码示例包括一个结构,该结构将常规的四乘四矩阵转换为 12 个浮点点数约定。

struct PackedMatrix
{
    public float c0x;
    public float c0y;
    public float c0z;
    public float c1x;
    public float c1y;
    public float c1z;
    public float c2x;
    public float c2y;
    public float c2z;
    public float c3x;
    public float c3y;
    public float c3z;

    public PackedMatrix(Matrix4x4 m)
    {
        c0x = m.m00;
        c0y = m.m10;
        c0z = m.m20;
        c1x = m.m01;
        c1y = m.m11;
        c1z = m.m21;
        c2x = m.m02;
        c2y = m.m12;
        c2z = m.m22;
        c3x = m.m03;
        c3y = m.m13;
        c3z = m.m23;
    }
}
在自定义着色器中访问 DOTS 实例化属性
URP中的DOTS实例化着色器示例