Shader_Properties参数,开关相关

Shader的Properties块一般与检视面板打交道

主要分三种类型:

- 属性:

_Name("Display Name", type) = defaultValue[{options}]
_Name("Display Name", type) = defaultValue[{options}]
_Name("Display Name", type) = defaultValue[{options}]
//解析:
_Name:供shader脚本使用的变量名
"Display Name":检视面板看到的名字
type:属性类型
常用类型和默认值:
	Color -01定义的rgba颜色,比如(1,1,1,1)2D/Cube - 对于贴图来说,默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或者"white","black","bump"中的一个
	Float - 某个指定的浮点数,如1.0
	Range(01-表示在区间01中间的浮点数
	Vector - 一个4维数,写为 (x,y,z,w)
例:
_MainColor ("Main Color", Color) = (0,0,1,0.5) 
_Texture ("Texture", 2D) = "white" {} 
_Cub("CubMap",Cube)=""{}
_Rgnge("Range",Range(0,1))=0.5
_Float("Float",Float)=1
_Vector("Vector",Vector)=(0,0,0,0)

每个属性一行,等号后需要跟默认值,行尾不能有结束符号

另外 还有一个{option},它只对2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一对什么都不含的空白的{},当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔。可能的选择有ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal中的一个,这些都是OpenGL中TexGen的模式,一般不常用

- 控制参数:

[HideInInspector]:在检视面板隐藏该属性。有时候我们shader中的属性需要脚本动态修改不需要美术同学进行调节,添加这个控制参数可以不在材质面板中显示,美术调节的的时候可以直接忽略方便美术同学对材质属性进行调节尤其是材质面板中属性参数较多的时候。
[NoScaleOffset]:检视面板不显示UV的偏移和缩放选项。
[Normal]:表示贴图是法线贴图。
[HDR]:表示贴图是HDR贴图。
[Gamma]:表示float/vector变量在检视面板里为sRGB。

- 开关控制:

ToggleDrawer
EnumDrawer
KeywordEnumDrawer
开关

例子:

Shader "Custom/Material Property Drawer Example"
{
	Properties
	{
	
		[Header(Material Property Drawer Example)]

		[Space(10)]

		_FirstColor("First Color", color) = (1,0,0,1)
		_SecondColor("Second Color", color) = (0,0,1,1)

		[Space(10)]

	
		[Toggle] _OneMinus("OneMinus color", Float) = 0
		[Toggle(ENABLE_HALF)] _Half("Half Color", Float) = 0
		[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Src Blend Mode", Float) = 1
		[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Dst Blend Mode", Float) = 1
		[Enum(Off, 0, On, 1)] _ZWrite("ZWrite", Float) = 0
		[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Float) = 0
		[Enum(UnityEngine.Rendering.CullMode)] _Cull("Cull Mode", Float) = 1
		[KeywordEnum(None, Add, Multiply)] _Overlay("Overlay ", Float) = 0


	}
		SubShader
		{
			Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
			Blend[_SrcBlend][_DstBlend]
			ZWrite[_ZWrite]
			ZTest[_ZTest]
			Cull[_Cull]

			Pass
			{
				CGPROGRAM

				#pragma shader_feature _ONEMINUS_ON

				#pragma shader_feature ENABLE_HALF

				#pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY

				#pragma vertex vert
				#pragma fragment frag

				#include "UnityCG.cginc"

				float4 _FirstColor;
		                float4 _SecondColor;
			
			

			struct appdata
			{
				float4 vertex : POSITION;
				
			};

			struct v2f
			{
				
				float4 vertex : SV_POSITION;
			};

			v2f vert(appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				// sample the texture
				fixed4 col = _FirstColor;
			fixed4 col2 = _SecondColor;

			// Use #if, #ifdef or #if defined
			#if _ONEMINUS_ON
			col = 1 - col;
			#endif

			// Use #if, #ifdef or #if defined
			#if ENABLE_HALF
			col *= 0.5;
			#endif

			

			#if _OVERLAY_ADD
			col += col2;
			#elif _OVERLAY_MULTIPLY
			col *= col2;
			#endif

			

			return col;
		}
		ENDCG
	}
	}
}

在这里插入图片描述
需要额外说明的一点,在上述代码中[Enum(UnityEngine.Rendering.BlendMode)]这个生命引用了UnityEngine中的函数,列出了BlendMode中所有的情况如下图
在这里插入图片描述
当然,某些情况下,我们并不希望列举出所有的混合模式,而只给少数的几个给美术人员使用。这一也是可以实现的,只需要我们自己来定义枚举的数值和显示就可以了。 通过在需要枚举的类型前面添加如下代码就可以了:

[Enum(One,1,SrcAlpha,5)] 

在这里插入图片描述

注意:枚举中的值不能随便定义,一定要跟融合的模型一一对应上,具体可以参看BlendMode中的定义:
Zero             = 0,
One              = 1,
DstColor         = 2,
SrcColor         = 3,
OneMinusDstColor = 4,
SrcAlpha         = 5,
OneMinusSrcColor = 6,
DstAlpha         = 7,
OneMinusDstAlpha = 8,
SrcAlphaSaturate = 9,
OneMinusSrcAlpha = 10

原文链接

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值