RenderMeshPrimitives(in RenderParams, Mesh, int, int)
Renders multiple instances of a Mesh using GPU instancing and a custom shader.
Read time 2 minutesLast updated 6 days ago
Definition
- Type: Method
- Namespace: UnityEngine
- Assembly: UnityEngine.CoreModule
RenderMeshPrimitives(RenderParams, Mesh, int, int)
public static void RenderMeshPrimitives(in RenderParams rparams, Mesh mesh, int submeshIndex, int instanceCount = 1)
Parameters
The parameters Unity uses to render the Mesh primitives.
The index of a submesh Unity renders when the Mesh contains multiple Materials (submeshes). For a Mesh with a single Material, use value 0.
The number of instances to render.
Remarks
This method renders multiple instances of the same Mesh, similar to Graphics.RenderMeshIndirect, but provides the number of instances and other rendering command arguments as function arguments.
Use semantic in shaders to access the rendered instance.
SV_InstanceIDThe following example uses to render 10 Mesh instances. The associated Material must use the below custom shader:
RenderMeshPrimitivesusing UnityEngine;public class ExampleClass : MonoBehaviour{ public Material material; public Mesh mesh; void Update() { RenderParams rp = new RenderParams(material); rp.worldBounds = new Bounds(Vector3.zero, 10000*Vector3.one); // use tighter bounds rp.matProps = new MaterialPropertyBlock(); rp.matProps.SetMatrix("_ObjectToWorld", Matrix4x4.Translate(new Vector3(-4.5f, 0, 0))); rp.matProps.SetFloat("_NumInstances", 10.0f); Graphics.RenderMeshPrimitives(rp, mesh, 0, 10); }}
Use the following example shader with the above C# example code:
Shader "ExampleShader"{ SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float4 color : COLOR0; }; uniform float4x4 _ObjectToWorld; uniform float _NumInstances; v2f vert(appdata_base v, uint instanceID : SV_InstanceID) { v2f o; float4 wpos = mul(_ObjectToWorld, v.vertex + float4(instanceID, 0, 0, 0)); o.pos = mul(UNITY_MATRIX_VP, wpos); o.color = float4(instanceID / _NumInstances, 0.0f, 0.0f, 0.0f); return o; } float4 frag(v2f i) : SV_Target { return i.color; } ENDCG } }}