版本: Unity 6 (6000.0)
语言English
  • C#

Graphics.RenderMeshInstanced

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每个建议更改,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static void RenderMeshInstanced(ref RenderParams rparams, Mesh mesh, int submeshIndex, T[] instanceData, int instanceCount = -1, int startInstance = 0);

声明

public static void RenderMeshInstanced(ref RenderParams rparams, Mesh mesh, int submeshIndex, List<T> instanceData, int instanceCount = -1, int startInstance = 0);

声明

public static void RenderMeshInstanced(RenderParams rparams, Mesh mesh, int submeshIndex, NativeArray<T> instanceData, int instanceCount = -1, int startInstance = 0);

参数

rparams Unity 用于渲染网格实例的参数。
mesh 要渲染的Mesh
submeshIndex 当 Mesh 包含多个材质(子网格)时,Unity 渲染子网格的索引。对于只有一个材质的 Mesh,使用值 0。
instanceData 用于渲染实例的实例数据数组。
instanceCount 要渲染的实例数量。当此参数为 -1(默认值)时,Unity 会渲染从startInstanceinstanceData数组末尾的所有实例。
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); } }