参考链接:
https://blog.csdn.net/qq826364410/article/details/81774741
https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html
1.#pragma multi_compile MY_multi_1 MY_multi_2
定义了两个shader关键字,一个是MY_multi_1,另一个是MY_multi_2
MultiCompile.shader
1 Shader "Custom/MultiCompile" 2 { 3 SubShader 4 { 5 Pass 6 { 7 CGPROGRAM 8 #pragma vertex vert 9 #pragma fragment frag 10 #pragma multi_compile MY_multi_1 MY_multi_2 11 12 #include "UnityCG.cginc" 13 14 struct appdata 15 { 16 float4 vertex : POSITION; 17 }; 18 19 struct v2f 20 { 21 float4 vertex : SV_POSITION; 22 }; 23 24 v2f vert (appdata v) 25 { 26 v2f o; 27 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 28 return o; 29 } 30 31 fixed4 frag (v2f i) : SV_Target 32 { 33 fixed4 col = fixed4(1, 0, 0, 0); 34 #ifdef MY_multi_1 35 col = fixed4(0, 1, 0, 0); 36 #endif 37 #ifdef MY_multi_2 38 col = fixed4(0, 0, 1, 0); 39 #endif 40 return col; 41 } 42 ENDCG 43 } 44 } 45 }
测试如下,来回按下QW,即可以看到两种颜色的切换
1 using UnityEngine; 2 3 public class MultiCompile : MonoBehaviour { 4 5 void Update () 6 { 7 if (Input.GetKeyDown(KeyCode.Q)) 8 { 9 Shader.EnableKeyword("MY_multi_1"); 10 Shader.DisableKeyword("MY_multi_2"); 11 } 12 else if(Input.GetKeyDown(KeyCode.W)) 13 { 14 Shader.EnableKeyword("MY_multi_2"); 15 Shader.DisableKeyword("MY_multi_1"); 16 } 17 } 18 }
2.#pragma multi_compile __ MY_multi_3
定义了一个shader关键字,MY_multi_3
MultiCompile2.shader
1 Shader "Custom/MultiCompile2" 2 { 3 SubShader 4 { 5 Pass 6 { 7 CGPROGRAM 8 #pragma vertex vert 9 #pragma fragment frag 10 #pragma multi_compile __ MY_multi_3 11 12 #include "UnityCG.cginc" 13 14 struct appdata 15 { 16 float4 vertex : POSITION; 17 }; 18 19 struct v2f 20 { 21 float4 vertex : SV_POSITION; 22 }; 23 24 v2f vert (appdata v) 25 { 26 v2f o; 27 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 28 return o; 29 } 30 31 fixed4 frag (v2f i) : SV_Target 32 { 33 fixed4 col = fixed4(1, 0, 0, 0); 34 #ifdef MY_multi_3 35 col = fixed4(1, 1, 1, 0); 36 #endif 37 return col; 38 } 39 ENDCG 40 } 41 } 42 }
测试如下,来回按下ER,即可以看到两种颜色的切换
1 using UnityEngine; 2 3 public class MultiCompile2 : MonoBehaviour { 4 5 void Update () 6 { 7 if (Input.GetKeyDown(KeyCode.E)) 8 { 9 Shader.EnableKeyword("MY_multi_3"); 10 } 11 else if (Input.GetKeyDown(KeyCode.R)) 12 { 13 Shader.DisableKeyword("MY_multi_3"); 14 } 15 } 16 }
分类:
UnityShader基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?