十二 Shader山下材质属性绘制器

增加了一个叫er的东西 , 可以使用它们标记在的里面 , 扩充的一些参数在编辑器上的样式 。
本文以山下(十一)纹理混合中的为例子 , 来介绍一下这些标记 。
Shader "Custom/Frag/Blend" {Properties {_MainTex ("Albedo (RGB)", 2D) = "white" {}_BlendTex ("Blend Texture", 2D) = "white" {}_Opacity ("Blend Opacity", Range(0, 1)) = 1[Space(50)][Header(MaterialPropertyDrawer)][KeywordEnum(None, Add, Multiply, Screen)] _BlendMode ("Blend Mode", Float) = 0//[Enum(None, 0, Add, 1, Multiply, 2, Screen ,3)] _BlendMode ("Blend Mode", Float) = 0[Space][Toggle] _Invert ("Invert?", Float) = 0[Toggle(ENABLE_DOUBLE)] _Double ("Double?", Float) = 0[PowerSlider(3.0)] _Power ("Power", Range(1,1024)) = 1}SubShader {Tags { "RenderType"="Opaque" }LOD 200Pass{CGPROGRAM#pragma vertex vert_img#pragma fragment frag#pragma fragmentoption ARB_precision_hint_fastest#include "UnityCG.cginc"uniform sampler2D _MainTex;sampler2D _BlendTex;fixed _Opacity;int _BlendMode;bool _Invert;bool _Double;fixed4 getBlended(fixed4 renderTex, fixed4 blendTex){fixed4 blended;switch (_BlendMode){case 0:blended = renderTex;break;case 1:blended = renderTex + blendTex;break;case 2:blended = renderTex * blendTex;break;case 3:blended = (1.0 - ((1.0 - renderTex) * (1.0 - blendTex)));break;}if (_Invert){blended = 1 - blended;}if (_Double){blended *= 2;}return blended;}fixed4 frag(v2f_img i) : COLOR{fixed4 renderTex = tex2D(_MainTex, i.uv);fixed4 blendTex = tex2D(_BlendTex, i.uv);fixed4 blended = getBlended(renderTex, blendTex);renderTex = lerp(renderTex, blended, _Opacity);return renderTex;}ENDCG}}FallBack "Diffuse"}
我们的材质编辑器就变成了这样:

十二  Shader山下材质属性绘制器

文章插图
首先是space标记 , 可以带参数也可以不带 。不带参数时 , 默认产生如图中Blend Mode与?之间的距离 。
【十二Shader山下材质属性绘制器】然后是标记 , 产生了一行加粗的文本 , 要注意参数不能加引号 , 包括后面的一些标记(一个奇怪的设定) 。
是产生一个下拉框
十二  Shader山下材质属性绘制器

文章插图
对应数值从0开始保存到里面 。修改这些值 , 就会出现山下(十一)纹理混合中各种不同的混合效果 。
并且在这里 , 它跟被注释掉的哪一行Enum是等同的 。而Enum与之区别在于 , 设置的数值可以不是连续并有序的 。
Enum最多支持7对值 , 而最多支持9个值 。
会创建一个开关 , 把bool值保存到和里面 , 至于带参数和不带参数之间的区别 , 我们稍后会讲到 。
最后一个只做展示用 , 它创建了一个指数增长的滑动条 , 我们可以把值改为512:
你会发现本来应该在中间位置的滑动按钮跑到了右边 。
其实还有另外一种形式可以使用 , 增加下面这些代码:
#pragma shader_feature _INVERT_ON#pragma shader_feature ENABLE_DOUBLE#pragma multi_compile _BLENDMODE_NONE _BLENDMODE_ADD _BLENDMODE_MULTIPLY _BLENDMODE_SCREENfixed4 getBlendedMacro(fixed4 renderTex, fixed4 blendTex){fixed4 blended;#if _BLENDMODE_NONEblended = renderTex;#elif _BLENDMODE_ADDblended = renderTex + blendTex;#elif _BLENDMODE_MULTIPLYblended = renderTex * blendTex;#elif _BLENDMODE_SCREENblended = (1.0 - ((1.0 - renderTex) * (1.0 - blendTex)));#endif#if _INVERT_ONblended = 1 - blended;#endif#if ENABLE_DOUBLEblended *= 2;#endifreturn blended;}
十二  Shader山下材质属性绘制器

文章插图
并把frag方法里面获取混合色彩值的方法改为: