着色器multi_compile笔记
概述一句multi_compile后面写若干个关键字XXX在代码里用#if XXX条件编译一段代码。开启、关闭关键字关键字的开启关闭在材质debug界面。在Valid Keywords填的关键字如果在某句multi_compile里会自动进入Valid Keywords否则进入Invalid。代码开启关键字使用shader.EnableKeyWord()对所有材质或material.EnabledKeyWord()对这个材质哪里看变体数量multi_compile A有几种变体1种。A一定执行不管有没有填A。Shader 学变体_一个关键字 { Properties { } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile A struct appdata { float4 vertex : POSITION; }; struct v2f { float4 pos : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.pos UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col; #ifdef A colfixed4(1,0,0,1); #endif #if !defined(A) colfixed4(1,1,1,1); #endif return col; } ENDCG } } }multi_compile A会编译#if A的代码就和#define A的效果是一样的。multi_compile _ A有几种变体2种带A和不带的。Shader 学变体_一个关键字和下划线 { Properties { } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile A _ struct appdata { float4 vertex : POSITION; }; struct v2f { float4 pos : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.pos UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col; #ifdef A colfixed4(1,0,0,1); #endif #if !defined(A) colfixed4(1,1,1,1); #endif return col; } ENDCG } } }multi_compile A B C允许从A B C选择一个关键字都不开就执行第一个如果没写任何关键字则开启第一个关键字。multi_compile A B _ C允许从A B C选择一个关键字或者不开如果没写任何关键字则不开。做几个题吧#pragma multi_compile A #pragma multi_compile B C DShader 学变体 { Properties { } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile A #pragma multi_compile B C D struct appdata { float4 vertex : POSITION; }; struct v2f { float4 pos : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.pos UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col; #ifdef B colfixed4(0,0,1,1); #endif #ifdef C colfixed4(0,1,0,1); #endif #ifdef D colfixed4(0,0,0,1); #endif #ifdef A colfixed4(1,0,0,1); #endif #if !defined(A) !defined(B) !defined(C) !defined(D) colfixed4(1,1,1,1); #endif return col; } ENDCG } } }不开任何关键字执行AA必执行。3种。这里直接看豆包说8个deepseek说6个。#pragma multi_compile A _ #pragma multi_compile B C DShader 学变体 { Properties { } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile A _ #pragma multi_compile B C D struct appdata { float4 vertex : POSITION; }; struct v2f { float4 pos : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.pos UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col; #ifdef B colfixed4(0,0,1,1); #endif #ifdef C colfixed4(0,1,0,1); #endif #ifdef D colfixed4(0,0,0,1); #endif #ifdef A colfixed4(1,0,0,1); #endif #if !defined(A) !defined(B) !defined(C) !defined(D) colfixed4(1,1,1,1); #endif return col; } ENDCG } } }6种。shader_featureshader_feature只定义一个关键字时会自动生成关键字不启用的情况。Shader My/LearnVariant { Properties { _MainTex (Texture, 2D) white {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma shader_feature A #include UnityCG.cginc struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col fixed4(0,0,0,1); #if defined(A) colfixed4(1,1,0,1); #endif //#if B //col fixed4(0,0,1,1); //#endif return col; } ENDCG } } }定义多个关键字时则不会自动生成全部不启用。全部不启用、全部启用都执行第一个关键字。Shader My/LearnVariant { Properties { _MainTex (Texture, 2D) white {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma shader_feature A B #include UnityCG.cginc struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex UnityObjectToClipPos(v.vertex); o.uv TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col fixed4(0,0,0,1); #if defined(A) colfixed4(1,1,0,1); #endif #if B col fixed4(0,0,1,1); #endif return col; } ENDCG } } }总结没有_一句multi_compile就是多选一必选一个默认选第一个。有_就是多选1或0默认不选。变体数直接每条multi_compile的选项相乘。shader_feature只有一个关键字是开关有多个关键字是多选一有多个关键字和_是多选1或0.在multi_compile和shader_feature问题上豆包和deepseek的话都是瞎扯淡万万不可相信以自己实验为准。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419585.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!