包含此页的版本:
不含此页的版本:
最佳做法是初始化所有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_ObjectToWorldunity_WorldToObjectunity_MatrixPreviousMunity_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;
}
}