文章目錄
- 前言
- 一、GPU Instancing的支持
- 1、硬件支持
- 2、Shader支持
- 3、腳本支持
- 二、我們來順著理一下GPU實例化的使用步驟
- 1、GPU實例化前的C#代碼準備
- 2、在 appdata 和 v2f 中定義GPU實例化ID
- 3、在頂點著色 和 片元著色器 設置GPU Instance ID,使實例化對象頂點位置正確(設置后坐標變換矩陣就生效)
- 4、如果GPU實例化后,需要不同對象使用不同屬性,Shader中GPU實例化怎么定義和使用屬性。以及在C#腳本中使用材質屬性塊來修改材質屬性
- 三、最終代碼
- Shader代碼:
- C#代碼:
前言
我們在之前的文章中,實現了GPU實例化的支持,我們在這篇文章中來整理總結一下
一、GPU Instancing的支持
1、硬件支持
2、Shader支持
3、腳本支持
二、我們來順著理一下GPU實例化的使用步驟
1、GPU實例化前的C#代碼準備
- Unity中Batching優化的GPU實例化(1)
2、在 appdata 和 v2f 中定義GPU實例化ID
- Unity中Batching優化的GPU實例化(2)
3、在頂點著色 和 片元著色器 設置GPU Instance ID,使實例化對象頂點位置正確(設置后坐標變換矩陣就生效)
- Unity中Batching優化的GPU實例化(3)
4、如果GPU實例化后,需要不同對象使用不同屬性,Shader中GPU實例化怎么定義和使用屬性。以及在C#腳本中使用材質屬性塊來修改材質屬性
- Unity中Batching優化的GPU實例化(4)
三、最終代碼
Shader代碼:
Shader "MyShader/P2_6_5"
{Properties{_Color("Color",Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_instancing#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;//1、定義GPU實例化 IDUNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;float3 worldPos : TEXCOORD4;//1、定義GPU實例化 IDUNITY_VERTEX_INPUT_INSTANCE_ID};UNITY_INSTANCING_BUFFER_START(prop)UNITY_DEFINE_INSTANCED_PROP(fixed4,_Color)UNITY_INSTANCING_BUFFER_END(prop)v2f vert (appdata v){//2、設置GPU實例化ID,使實例化對象頂點位置正確UNITY_SETUP_INSTANCE_ID(v);v2f o;UNITY_TRANSFER_INSTANCE_ID(v, o);o.pos = UnityObjectToClipPos(v.vertex);o.worldPos = mul(unity_ObjectToWorld,v.vertex);o.uv = v.uv;return o;}fixed4 frag (v2f i) : SV_Target{//2、設置GPU實例化ID,使實例化對象頂點位置正確UNITY_SETUP_INSTANCE_ID(i);return i.worldPos.y * 0.15 + UNITY_ACCESS_INSTANCED_PROP(prop,_Color);}ENDCG}}
}
C#代碼:
using UnityEngine;public class P2_6_5 : MonoBehaviour
{public GameObject Prefab;public int Count = 1;public int Range = 10;// Start is called before the first frame updatevoid Start(){for (int i = 0;i < Count;i++){Vector3 pos = Random.insideUnitCircle * Range;GameObject chair = Instantiate(Prefab,new Vector3(pos.x,0,pos.y),Quaternion.identity);Color color = new Color(Random.value,Random.value,Random.value);MaterialPropertyBlock prop = new MaterialPropertyBlock();prop.SetColor("_Color",color);chair.GetComponentInChildren<MeshRenderer>().SetPropertyBlock(prop);}}
}