您的位置:首页 > 文旅 > 美景 > [Unity]开启材质GPU Instancing,合批相同材质不同颜色的物体。

[Unity]开启材质GPU Instancing,合批相同材质不同颜色的物体。

2024/10/5 19:19:39 来源:https://blog.csdn.net/qq302756113/article/details/114835238  浏览:    关键词:[Unity]开启材质GPU Instancing,合批相同材质不同颜色的物体。

1. 在自定义shader里添加宏定义:

#pragma multi_compile_instancing

然后在材质的Inspector栏可以看到GPU Instancing选项,勾选即可。

2. 在自定义shader定义属性的代码下添加:

     UNITY_INSTANCING_BUFFER_START(Props)UNITY_DEFINE_INSTANCED_PROP(half4, _Color)UNITY_INSTANCING_BUFFER_END(Props)

2. 在自定义shader的输入输出结构体里添加代码:
 

UNITY_VERTEX_INPUT_INSTANCE_ID

3. 在自定义shader的输入输出函数内添加代码:

UNITY_SETUP_INSTANCE_ID(v);UNITY_SETUP_INSTANCE_ID(i);

下面是Unity官方shader示例:

1. 表面着色器

Shader "Custom/InstancedColorSurfaceShader"
{Properties{_Color ("Color", Color) = (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) = "white" {}_Glossiness ("Smoothness", Range(0,1)) = 0.5_Metallic ("Metallic", Range(0,1)) = 0.0}SubShader{Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM// Uses the physically based standard lighting model with shadows enabled for all light types.#pragma surface surf Standard fullforwardshadows// Use Shader model 3.0 target#pragma target 3.0sampler2D _MainTex;struct Input{float2 uv_MainTex;};half _Glossiness;half _Metallic;UNITY_INSTANCING_BUFFER_START(Props)UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)UNITY_INSTANCING_BUFFER_END(Props)void surf (Input IN, inout SurfaceOutputStandard o) {fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * UNITY_ACCESS_INSTANCED_PROP(Props, _Color);o.Albedo = c.rgb;o.Metallic = _Metallic;o.Smoothness = _Glossiness;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}

2. 顶点片元着色器

Shader "Custom/SimplestInstancedShader"
{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;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float4 vertex : SV_POSITION;UNITY_VERTEX_INPUT_INSTANCE_ID // use this to access instanced properties in the fragment shader.};UNITY_INSTANCING_BUFFER_START(Props)UNITY_DEFINE_INSTANCED_PROP(float4, _Color)UNITY_INSTANCING_BUFFER_END(Props)v2f vert(appdata v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_TRANSFER_INSTANCE_ID(v, o);o.vertex = UnityObjectToClipPos(v.vertex);return o;}fixed4 frag(v2f i) : SV_Target{UNITY_SETUP_INSTANCE_ID(i);return UNITY_ACCESS_INSTANCED_PROP(Props, _Color);}ENDCG}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com