很多時候,我們為了使寫出來的shader更加直觀易用,需要對材質面板的顯示樣式做一些簡單的修改。雖然Unity提供了Custom Shader GUI的方法,但是對於我們只想單純地寫一個shader來說,還要再去改GUI未免太過麻煩。所以我們還是決定直接在shader代碼裡對材質面板進行設定。
Shader "Custom/Custom Material Inspector"{ Properties { [Header(Custom Material Inspector)]
[Space]
_MainTex ("Main Tex", 2D) = "white" {}
[NoScaleOffset]_SecondTex ("Second Tex", 2D) = "white" {}
[Space(50)]
[Toggle] _Invert ("Invert color?", Float) = 0
[Toggle(ENABLE_FANCY)] _Fancy ("Fancy?", Float) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Src Blend Mode", Float) = 1 [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Dst Blend Mode", Float) = 1 [Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull Mode", Float) = 1 [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 0
[Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Float) = 0 [KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0
[PowerSlider(3.0)] _Brightness ("Brightness", Range (0.01, 1)) = 0.1 } SubShader { Tags { "Queue"="Transparent" "RenderType"="Transparent" } Blend [_SrcBlend] [_DstBlend] Cull [_Cull] ZTest [_ZTest] ZWrite [_ZWrite]
Pass { CGPROGRAM
#pragma shader_feature _INVERT_ON
#pragma shader_feature ENABLE_FANCY
#pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY
#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"
sampler2D _MainTex; float4 _MainTex_ST; sampler2D _SecondTex; float4 _SecondTex_ST; float _Brightness;
struct v2f { float4 uv : TEXCOORD0; float4 vertex : SV_POSITION; };
v2f vert (appdata_base v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex); o.uv.zw = TRANSFORM_TEX(v.texcoord, _SecondTex); return o; }
fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv.xy);
#if _INVERT_ON col = 1 - col; #endif
#if ENABLE_FANCY col.r = 0.5; #endif
fixed4 secCol = tex2D(_SecondTex, i.uv.zw);
#if _OVERLAY_ADD col += secCol; #elif _OVERLAY_MULTIPLY col *= secCol; #endif
col *= _Brightness;
return col; } ENDCG } }}注意:以上shader僅僅只是為了方面演示,從而把所有情況進行了匯總。從渲染效果的角度來說並不是一個正常的shader。
如果有興趣,也可以詳細閱讀Unity的官方文檔:
https://docs.unity3d.com/2019.3/Documentation/ScriptReference/MaterialPropertyDrawer.html
聲明:發布此文是出於傳遞更多知識以供交流學習之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與我們聯繫,我們將及時更正、刪除,謝謝。
作者:Faith Tong
原文:https://zhuanlan.zhihu.com/p/78589597
More:【微信公眾號】 u3dnotes