rparams | Unity 用于渲染网格实例的参数。 |
mesh | 要渲染的Mesh。 |
submeshIndex | 当 Mesh 包含多个材质(子网格)时,Unity 渲染子网格的索引。对于只有一个材质的 Mesh,使用值 0。 |
instanceData | 用于渲染实例的实例数据数组。 |
instanceCount | 要渲染的实例数量。当此参数为 -1(默认值)时,Unity 会渲染从startInstance 到instanceData 数组末尾的所有实例。 |
startInstance | 要渲染的instanceData 中的第一个实例。 |
使用 GPU 实例化渲染网格的多个实例。
此函数渲染当前帧的网格,类似于Graphics.RenderMesh,但由于使用了 GPU 实例化,因此性能更高。
使用此函数使用实例化着色器多次渲染相同的 Mesh。除非您使用RenderParams.worldBounds
覆盖边界,否则 Unity 会自动计算此 Mesh 所有实例的边界。Unity 使用边界将此 Mesh 的所有实例作为一个实体进行剔除和排序,相对于场景中其他渲染的 Mesh。
传递的instanceData
可以是Matrix4x4
数组(每个实例的对象到世界变换)或自定义数据结构。当instanceData
是自定义数据结构时,该结构可以包含以下成员
Matrix4x4 objectToWorld; // mandatory: Specifies object-to-world transformation matrix. uint renderingLayerMask; // optional: Specifies rendering layer mask per instance. If not defined, uses the renderLayerMask passed in RenderParams. Matrix4x4 prevObjectToWorld; // optional: Specifies previous frame object-to-world transformation matrix (used for motion vector rendering).
这些成员可以以任何顺序出现在结构体中,但当使用时,它们必须具有上述名称和类型。实例化渲染会忽略您为自身使用而包含在结构体中的任何其他成员。以下自定义结构体的示例定义了必需的objectToWorld
成员、可选的renderingLayerMask
成员以及自定义weight
成员(被RenderMeshIndirect
函数忽略)。
public struct MyInstanceData { Matrix4x4 objectToWorld; // We must specify object-to-world transformation for each instance uint renderingLayerMask; // In addition we also like to specify rendering layer mask per instence. float weight; // Just some additional per-instance data unrelated to rendering };
要使用光探针,请将RenderParams.lightProbeUsage设置为LightProbeUsage.BlendProbes,以便自动为每个实例设置光探针。或者,使用LightProbeUsage.CustomProvided手动提供自定义光探针数据。
您一次最多只能渲染 1023 个实例。最大值取决于您每个实例使用的数据量。
默认情况下,Unity 为每个实例使用objectToWorld
矩阵和worldToObject
矩阵,这意味着您一次最多可以渲染 511 个实例。要从实例数据中删除worldToObject
矩阵,请在着色器中添加#pragma instancing_options assumeuniformscaling
。
如果材质的Material.enableInstancing未设置为 true,或者当前平台不支持此 API,或者 GPU 实例化不可用,则 Unity 会抛出 InvalidOperationException。有关更多信息,请参阅SystemInfo.supportsInstancing。
其他资源:RenderMesh。
以下示例使用RenderMeshInstanced
渲染 10 个网格。在此脚本中,您需要在材质上启用“GPU 实例化”
using UnityEngine;
public class ExampleClass : MonoBehaviour { public Material material; public Mesh mesh; const int numInstances = 10;
void Update() { RenderParams rp = new RenderParams(material); Matrix4x4[] instData = new Matrix4x4[numInstances]; for(int i=0; i<numInstances; ++i) instData[i] = Matrix4x4.Translate(new Vector3(-4.5f+i, 0.0f, 5.0f)); Graphics.RenderMeshInstanced(rp, mesh, 0, instData); } }
以下示例使用自定义实例数据结构,该结构提供对象到世界变换和渲染层蒙版以渲染每个实例。出于演示目的,该结构还定义了一个自定义数据成员myOtherData
,该成员不用于渲染,但可用于其他目的
using UnityEngine;
public class ExampleClass : MonoBehaviour { public Material material; public Mesh mesh; const int numInstances = 10;
struct MyInstanceData { public Matrix4x4 objectToWorld; public float myOtherData; public uint renderingLayerMask; };
void Update() { RenderParams rp = new RenderParams(material); MyInstanceData[] instData = new MyInstanceData[numInstances]; for(int i=0; i<numInstances; ++i) { instData[i].objectToWorld = Matrix4x4.Translate(new Vector3(-4.5f+i, 0.0f, 5.0f)); instData[i].renderingLayerMask = (i & 1) == 0 ? 1u : 2u; } Graphics.RenderMeshInstanced(rp, mesh, 0, instData); } }