clip() step(a,x) lerp(a,b,x)
函数1,clip(value),用于消融,此方法比较节省性能消耗,value的值小于零则丢弃像素,否则保留,实例:
float4 frag(VertexOutput i) : COLOR {
float4 _Maintex_var = tex2D(_Maintex,TRANSFORM_TEX(i.uv0, _Maintex));
//让贴图的透明通道减去一个变量,就能控制变量进行裁切贴图
clip(_Maintex_var.a- _Cutoff);
return _Maintex_var;
}
函数2: Step(a,x):如果x<a返回0;如果x>或=a返回1
lerp(a,b,x):线性插值函数,返回值为(1-x)a+bx
Shader "Shader Forge/test_lerp/step" {
Properties {
_Maintex ("Maintex", 2D) = "white" {}
[HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
[hdr]_color01("color01",color)=(1,1,1,1)
[hdr]_color02("color02",color)=(1,1,1,1)
_colorCtl("color Ctrol",float)=0
}
SubShader {
Tags {
"IgnoreProjector"="True"
"Queue"="Transparent"
"RenderType"="Transparent"
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase
#pragma target 3.0
uniform sampler2D _Maintex; uniform float4 _Maintex_ST;
float4 _color01;
float4 _color02;
float _colorCtl;
struct VertexInput {
float4 vertex : POSITION;
float2 texcoord0 : TEXCOORD0;
float4 vertexColor : COLOR;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
float4 vertexColor : COLOR;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.uv0 = v.texcoord0;
o.vertexColor = v.vertexColor;
o.pos = UnityObjectToClipPos( v.vertex );
return o;
}
float4 frag(VertexOutput i) : COLOR {
// Lighting:
// Emissive:
float4 _Maintex_var = tex2D(_Maintex,TRANSFORM_TEX(i.uv0, _Maintex));
//step(a,x) 可以用来做硬边效果
float dissolveArea=step(0,(_Maintex_var.r+_colorCtl));
//对dissolveArea进行颜色插值输出
float3 finalColor=lerp(_color01.rgb,_color02.rgb,dissolveArea);
return fixed4(finalColor,(_Maintex_var.a*i.vertexColor.a));
}
ENDCG
}
}
}
函数3 frac(x) 对参数x只取小数部分,整数部分去掉,这个函数对于渲染重复性纹理的时候非常好用,比如我想制作一个全息的线条纹理,就可以把模型的坐标纹理i.uv.r进行frac(),当i.uv.r越大时,frac()的重复就越多:
Shader "Shader Forge/test" {
Properties {
_linectrol ("linectrol", Float ) = 0
_LineTile ("LineTile", Range(0, 10)) = 6.384615
}
SubShader {
Tags {
"IgnoreProjector"="True"
"Queue"="Transparent"
"RenderType"="Transparent"
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase
#pragma only_renderers d3d9 d3d11 glcore gles
#pragma target 3.0
uniform float _linectrol;
uniform float _LineTile;
struct VertexInput {
float4 vertex : POSITION;
float2 texcoord0 : TEXCOORD0;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.uv0 = v.texcoord0;
o.pos = UnityObjectToClipPos( v.vertex );
return o;
}
float4 frag(VertexOutput i) : COLOR {
// Lighting:
// Emissive:
float node_9370 = step(_linectrol,frac((i.uv0.r*_LineTile)));
float3 emissive = float3(node_9370,node_9370,node_9370);
float3 finalColor = emissive;
return fixed4(finalColor,1);
}
ENDCG
}
}
}
函数4:不开启透明度混合alphablend,能不能让材质球产生半透明,这个可以用一个巧妙的方法,可以让grabtexture跟材质球的主题颜色进行一个插值,就可以在不开启半透明混合的情况下获得材质球的半透效果:缺点:这个会多一个屏幕采样pass
Shader "Shader Forge/test" {
Properties {
_MainTex ("MainTex", 2D) = "white" {}
}
SubShader {
Tags {
"IgnoreProjector"="True"
"Queue"="Transparent"
"RenderType"="Transparent"
}
GrabPass{ }
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
Blend one zero
ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase
#pragma only_renderers d3d9 d3d11 glcore gles
#pragma target 3.0
uniform sampler2D _GrabTexture;
uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
struct VertexInput {
float4 vertex : POSITION;
float2 texcoord0 : TEXCOORD0;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
float4 projPos : TEXCOORD1;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.uv0 = v.texcoord0;
o.pos = UnityObjectToClipPos( v.vertex );
o.projPos = ComputeScreenPos (o.pos);
COMPUTE_EYEDEPTH(o.projPos.z);
return o;
}
float4 frag(VertexOutput i) : COLOR {
float2 sceneUVs = (i.projPos.xy / i.projPos.w);
float4 sceneColor = tex2D(_GrabTexture, sceneUVs);
// Lighting:
float4 _MainTex_var = tex2D(_MainTex,TRANSFORM_TEX(i.uv0, _MainTex));
float3 finalColor = lerp(sceneColor.rgb,_MainTex_var.rgb,_MainTex_var.a);
return fixed4(finalColor,1);
}
ENDCG
}
}
}
函数5:如何去色,把所采样的贴图进行去色处理:
将采样的纹理进行Dot点乘:y=dot(x,float3(0.3,0.59,0.11));
float3 color=float3(y,y,y);
函数6:parallax:原意为“视差”
函数7:
floor(value)函数
功能:把一个小数向下取整
可以实现类似于卡通效果的色彩分层效果
float3 emissive = floor(_Maintex.rgb*_numCtrol)/_numCtrol;
函数9:grabpass
函数10:天空盒子采样;
bump = normalize(half3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump)));
fixed3 reflDir = reflect(-viewDir, bump);
fixed3 reflCol = texCUBE(_Cubemap, reflDir).rgb * _Color.rgb;
函数11:saturate(x) (将x值规范到0~1之间)
当你想将颜色值规范到0~1之间时,你可能会想到使用saturate函数(saturate(x)的作用是如果x取值小于0,则返回值为0。如果x取值大于1,则返回值为1。若x在0到1之间,则直接返回x的值.),当然saturate也可以使用变量的swizzled版本,比如saturate(somecolor.rgb);
函数12:max(0,x) 输入x,if x<0,max=0;else,max=x