ShaderForge学习笔记:Properties属性
发表于2018-07-16
这篇让大家来学习下ShaderForge插件中Properties属性的概念与使用。
ShaderForge属性

ShaderForge基础属性
颜色和四维向量
1、Color
官网说明

一个四维的数组,与Vector4节点相似,但是在材质球编辑器中是使用取色器赋值。
节点输出
输出RGBA四维颜色值

2、Vector4
官方说明

一个具有四个分量的数据,与Vector4(非属性节点Vector4)相同,但在材质球Inpector面板中显示是4个分开的X、Y、Z和W值。
节点输出
输出XYZW四维向量值

UntiyShader中定义颜色和向量属性
name ("display name", Color) = (number,number,number,number) name ("display name", Vector) = (number,number,number,number)
数字
3、Value
官方说明

一个一维数值,与Value节点(非属性节点)一样,但是会在材质球Inspector面板上显示出来。
节点输出
输出一个一维数值

4、Slider
官方说明

允许您轻松地调整最小值和最大值之间的值并将数值展示在Inspector面板中。
节点输出
同Value一样,都是输出一个一维数值,只能可以设置范围的最大值和最小值,并在面板中表现为滑动条

UnityShader中定义数字属性
name ("display name", Range (min, max)) = number //Range name ("display name", Float) = number //Float name ("display name", Int) = number //Int
纹理
5、Texture2D
官方说明

Texture2D节点包含对一张纹理的引用,并将在特定的UV坐标(如果连接)上对纹理进行采样。如果[Tex]输入是由Texture Assets节点连接的,该节点将不再显示在材质球面板上。输出[RGB]和单独RGBA的通道。
节点输出
节点输出的是存储纹理信息的RGBA四维数组和单独的R、G、B、A通道数据,每个通道都输出对应的一个一维数组。

6、Cubemap
官方说明

包含对cubemap的引用,并将以特定的MIP级别(如果连接的话)对它进行采样。输出[RGB]和单独的通道。
UnityShader中定义纹理
- 2D纹理
- Cube纹理(立方体纹理)
- 3D纹理 1,只能用script创建 2.opengl3.0及以上才支持
name ("display name", 2D) = "defaulttexture" {} name ("display name", Cube) = "defaulttexture" {} name ("display name", 3D) = "defaulttexture" {}

每条属性在subshader中用name引用
在材质球的Inspector面板中显示为display name
使用’=’赋予默认值。
注意:句末不要有分号
参考
官方手册Manual/SL-Properties
More
7、Switch
官方说明

节点输出

UnityShader实现Switch
在Toggle的基础上加上Lerp操作就得到了Switch开关
写法
Shader "Hidden/Switch" { Properties { // 借助MaterialPropertyDrawer在材质面板定义类似于bool的变量,用于控制代码流程 [Toggle] _TOGGLE("m_toggle", Float) = 0 _color1("color1", Color) = (1, 0, 0, 1) _color2("color2", Color) = (0, 1, 0, 1) } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" //定义shader关键字"_TOGGLE_ON" #pragma shader_feature _TOGGLE_ON 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 _color1; fixed4 _color2; fixed4 frag(v2f i) : SV_Target { fixed toggleValue; // 如果勾选了_TOGGLE #ifdef _TOGGLE_ON toggleValue = 1; #else toggleValue = 0; #endif float3 color = lerp(_color1.rgb, _color2.rgb, toggleValue); return fixed4(color, 1); } ENDCG } } }
演示

8、Toggle
官方说明

一个基于复选框的0或1的值。
节点输出
勾选输出1,不勾选输出0

UnityShader实现Toggle
借助MaterialPropertyDrawer在材质面板定义类似于bool的变量
- 写法
Shader "Hidden/properties" { Properties { // 借助MaterialPropertyDrawer在材质面板定义类似于bool的变量,用于控制代码流程 [Toggle] _TOGGLE("m_toggle", Float) = 0 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" //定义shader关键字"_TOGGLE_ON" #pragma shader_feature _TOGGLE_ON 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 { float3 color; // 如果勾选了_TOGGLE #ifdef _TOGGLE_ON color = float3(1, 1, 1); #else color = float3(0, 0, 0); #endif return fixed4(color,1); } ENDCG } } }
效果

9、Texture Assets
官方说明

该节点是一个对纹理的引用,用于对单个纹理进行多次采样。Texture Assets节点只能连接到
Texture2D节点的[Tex]。在材质球的面板中的反映是,用户只需要分配一个纹理。
节点输出
tex输出图片的纹理的RGBA的纹理信息,只能链接到Texture2d的tex输入通道。一个texture2d节点的tex连接了texAssets之后就不再显示在材质球的属性面板上,且其纹理不能再在节点中选择而是随着连接的Texture Assets的纹理变化而变化。

巧妙的使用Texture Assets节点可以让我们连接的shaderforge节点树更加清晰可读。
来自:https://blog.csdn.net/v_xchen_v/article/details/79146160
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引