unity-shader-13
2024年5月18日
特效类大纲
包括透明混合的几种模式、UV顶点动画、绕动等。
- 透明:
- AB;
- AD;
- AC;
- 自定义混合方式;
- 动画:
- 参数动画
- UV动画
- UV流动
- UV扰动
- 序列帧动画
- 顶点动画
- 顶点位置动画
- 顶点颜色动画
- 映射:
- 极坐标
- 屏幕坐标UV
- 透明扭曲
透切 AlphaCutout-AC
用途:
- 常用于复杂轮廓,明确边缘的物体表现,如:镂空金属,裙摆边缘,特定风格下的头发,树叶,等;
- 卡通渲染的特效表现; 优点:
- 没有排序问题; 缺点:
- 边缘效果太实;
- 移动端性能较差;
步骤:
- 以手写FlatCol(第3课)作为模板,CtrlCV伺候;
- 修改Shader路径名;
- 面板参数添加:
- _MainTex:主纹理 RGB颜色 A透贴;
- _Cutoff:透明剪切阈值;
- 修改SubShaderTags;
- RenderType:修改为对应的TransparentCutout;
- ForceNoShadowCasting:设置为True,关闭投影;
- IgnoreProjector:设置为True,不响应投射器;
- 对应声明输入参数;
- 输入,输出,顶点Shader,增加UV相关代码;
- 像素Shader:
- 对主纹理采样,RGB颜色 A透贴;
- 基于透贴灰度和透切阈值,产生透明效果;
- 返回值;
Code-view
L13_AC.shader
Shader "AP1/L13/L13_AC" // 自定义Shader路径
{
// 材质面板参数
Properties {
_MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{} //主纹理 RGB颜色 A透贴;
_Cutoff ("透切阈值", range(0.0, 1.0)) = 0.5 //透明剪切阈值
}
SubShader {
Tags {
"RenderType"="TransparentCutout" // 对应改为Cutout RenderType 还可以玩鹰眼效果
"ForceNoShadowCasting"="True" // 关闭阴影投射
"IgnoreProjector"="True" // 不响应投射器
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
//输入参数
uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
uniform half _Cutoff;
// 输入结构
struct VertexInput {
float4 vertex : POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输出结构
struct VertexOutput {
float4 pos : SV_POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输入结构 >>> 顶点shader >>> 输出结构 ,下面是个函数构架
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex ); // 顶点位置 OS>CS
o.uv = TRANSFORM_TEX(v.uv, _MainTex); // UV信息 支持TilingOffset
return o; // 将输出结构 输出
}
// 输出结构 >>> 像素
float4 frag(VertexOutput i) : COLOR {
half4 var_MainTex = tex2D(_MainTex, i.uv); // 采样贴图 RGB颜色 A透贴
clip(var_MainTex.a - _Cutoff); // 透明剪切
return var_MainTex; // 返回值
}
ENDCG
}
}
FallBack "Diffuse"
}
透混 AlphaBland-AB
用途:
- 常用于复杂轮廓,无明确边缘的物体表现;
- 常用于半透明的物体表现;
- 一般的特效表现,打底用; 优点:
- 移动端性能较好;
- 边缘效果较好 缺点:
- 有排序问题;
步骤:
- 以AC作为模板,CtrlCV伺候;
- 修改Shader路径名;
- 面板参数保留:
- _MainTex:主纹理 RGB颜色 A透贴;
- 修改SubShaderTags;
- Queue:渲染队列修改为对应的Transparent;
- RenderType:修改为对应的Transparent;
- ForceNoShadowCasting:设置为True,关闭投影;
- IgnoreProjector:设置为True,不响应投射器;
- 修改混合方式:Blend One/SrcAlpha OneMinusSrcAlpha;
- 对应声明输入参数;
- 输入,输出,顶点Shader,不用改;
- 像素Shader:
- 对主纹理采样,RGB颜色 A透贴;
- 返回值;
Code-view
L13_AB.shader
Shader "AP1/L13/L13_AB" // 自定义Shader路径
{
// 材质面板参数
Properties {
_MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{} //主纹理 RGB颜色 A透贴;
}
SubShader {
Tags {
"Queue"="Transparent" // 调整渲染顺序
"RenderType"="TransparentCutout" // 对应改为Cutout RenderType 还可以玩鹰眼效果
"ForceNoShadowCasting"="True" // 关闭阴影投射
"IgnoreProjector"="True" // 不响应投射器
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
Cull Off
Blend One OneMinusSrcAlpha // 修改混合方式One/SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
//输入参数
uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
// 输入结构
struct VertexInput {
float4 vertex : POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输出结构
struct VertexOutput {
float4 pos : SV_POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输入结构 >>> 顶点shader >>> 输出结构 ,下面是个函数构架
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex ); // 顶点位置 OS>CS
o.uv = TRANSFORM_TEX(v.uv, _MainTex); // UV信息 支持TilingOffset
return o; // 将输出结构 输出
}
// 输出结构 >>> 像素
float4 frag(VertexOutput i) : COLOR {
half4 var_MainTex = tex2D(_MainTex, i.uv); // 采样贴图 RGB颜色 A透贴
return var_MainTex; // 返回值
}
ENDCG
}
}
FallBack "Diffuse/"
}
透叠 Addtive-AD
用途:
- 常用于发光体,辉光的表现;
- 一般的特效表现,提亮用; 问题:
- 有排序问题;
- 多层叠加容易堆爆性能(OverDraw);
- 作为辉光效果,通常可用后处理代替;
步骤:
- 以AB作为模板,CtrlCV伺候;
- 修改Shader路径名;
- 面板参数,不用改;
- SubShaderTags,不用改;
- 混合模式修改为:Blend One One;
- 输入参数,不用改;
- 输入,输出,顶点Shader,不用改;
- 像素Shader:
- 对主纹理采样,RGB颜色即可;
- 返回值;
Code-view
L13_AD.shader
Shader "AP1/L13/L13_AD" // 自定义Shader路径
{
// 材质面板参数
Properties {
_MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{} //主纹理 RGB颜色 A透贴;
}
SubShader {
Tags {
"Queue"="Transparent" // 调整渲染顺序
"RenderType"="TransparentCutout" // 对应改为Cutout RenderType 还可以玩鹰眼效果
"ForceNoShadowCasting"="True" // 关闭阴影投射
"IgnoreProjector"="True" // 不响应投射器
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
Cull Off
Blend One One //修改混合方式
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
//输入参数
uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
// 输入结构
struct VertexInput {
float4 vertex : POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输出结构
struct VertexOutput {
float4 pos : SV_POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输入结构 >>> 顶点shader >>> 输出结构 ,下面是个函数构架
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex ); // 顶点位置 OS>CS
o.uv = TRANSFORM_TEX(v.uv, _MainTex); // UV信息 支持TilingOffset
return o; // 将输出结构 输出
}
// 输出结构 >>> 像素
float4 frag(VertexOutput i) : COLOR {
half3 var_MainTex = tex2D(_MainTex, i.uv).rgb; // 采样贴图 RGB颜色 A透贴不必须
return half4(var_MainTex, 1.0); // 返回值
}
ENDCG
}
}
FallBack "Diffuse/"
}
混合模式
- AB,AC,AD只是非常多种混合模式中常用的几种;足够 应付一般项目的特效需求;
- 不排除某些风格特殊,或者特殊用途的场景需要用到其他 混合模式;一般我们提供工具给美术做探索;
- 探索完毕之后还是要收敛方案,更少的美术选项可让美术 流程更可控;
混合原理
公式如下:
Src*SrcFactor op Dst*DstFactor
- Src:源,当前Shader绘制的结果;
- Dst:目标,当前Shader绘制前的背景;
- SrcFactor:源乘子,多种形式如下表;
- DstFactor:目标乘子,多种形式如下表;
- Op:混合运算符,多种形式如右表;
BlendFactor:
BlendFactor | Description |
---|---|
Zero | Blend factor is (0, 0, 0, 0). |
One | Blend factor is (1, 1, 1, 1). |
DstColor | Blend factor is (Rd, Gd, Bd, Ad). |
SrcColor | Blend factor is (Rs, Gs, Bs, As). |
OneMinusDstColor | Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad); |
SrcAlpha | Blend factor is (As, As, As, As). |
OneMinusSrcColor | Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As). |
DstAlpha | Blend factor is (Ad, Ad, Ad, Ad). |
OneMinusDstAlpha | Blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad). |
SrcAlphaSaturate | Blend factor is (f, f, f, 1); where f = min(As, 1 - Ad). |
OneMinusSrcAlpha | Blend factor is (1 - As, 1 - As, 1 - As, 1 - As). |
BlendOp:
BlendOp | Description |
---|---|
Add | Addition (s + d) |
Subtract | Subtraction (s - d) |
ReverseSubtract | Reverse subtraction (d - s) |
Min | Minimum |
Max | Maximum |
Multiply | Multiply (Advanced OpenGL Blending) |
Screen | Screen (Advanced OpenGL Blending) |
Overlay | Overlay (Advanced OpenGL Blending) |
Darken | Darken (Advanced OpenGL Blending) |
Lighten | Lighten (Advanced OpenGL Blending) |
ColorDodge | Color dodge (Advanced OpenGL Blending) |
ColorBurn | Color burn (Advanced OpenGL Blending) |
HardLight | Hard light (Advanced OpenGL Blending) |
SoftLight | Soft light (Advanced OpenGL Blending) |
Difference | Difference (Advanced OpenGL Blending) |
Exclusion | Exclusion (Advanced OpenGL Blending) |
HSLHue | HSL Hue (Advanced OpenGL Blending) |
HSLSaturation | HSL saturation (Advanced OpenGL Blending) |
HSLColor | Hsl color (Advanced OpenGL Blending) |
HSLLuminosity | HSLLuminosity (Advanced OpenGL Blending) |
美术自定义混合面板
步骤:
- 以AB作为模板,CtrlCV伺候;
- 修改Shader路径名;
- 面板参数:
- _MainTex:主纹理 RGB颜色 A透贴;
- _BlendSrc:混合源乘子;
- _BlendDst:混合目标乘子;
- _BlendOp:混合算符;
- SubShaderTags,不用改;
- 混合算符修改为:BlendOp [BlendOp]
- 混合方式修改为:Blend [BlendSrc] [BlendDst]
- 输入,输出,顶点Shader,不用改;
- 像素Shader,不用改;
Code-view
L13_BlandMode.shader
Shader "AP1/L13/L13_BlandMode" // 自定义Shader路径
{
// 材质面板参数
Properties {
_MainTex ("RGB:颜色 A:透贴", 2d) = "gray"{} //主纹理 RGB颜色 A透贴;
[Enum(UnityEngine.Rendering.BlendMode)]
_BlendSrc ("混合源乘子", int) = 0
[Enum(UnityEngine.Rendering.BlendMode)]
_BlendDst ("混合目标乘子", int) = 0
[Enum(UnityEngine.Rendering.BlendOp)]
_BlendOp ("混合算符", int) = 0
}
SubShader {
Tags {
"Queue"="Transparent" // 调整渲染顺序
"RenderType"="TransparentCutout" // 对应改为Cutout RenderType 还可以玩鹰眼效果
"ForceNoShadowCasting"="True" // 关闭阴影投射
"IgnoreProjector"="True" // 不响应投射器
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
Cull Off
BlendOp [_BlendOp] // 可自定义混合算符
Blend [_BlendSrc] [_BlendDst] // 可自定义混合模式
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
//输入参数
uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
// 输入结构
struct VertexInput {
float4 vertex : POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输出结构
struct VertexOutput {
float4 pos : SV_POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输入结构 >>> 顶点shader >>> 输出结构 ,下面是个函数构架
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos( v.vertex ); // 顶点位置 OS>CS
o.uv = TRANSFORM_TEX(v.uv, _MainTex); // UV信息 支持TilingOffset
return o; // 将输出结构 输出
}
// 输出结构 >>> 像素
float4 frag(VertexOutput i) : COLOR {
half4 var_MainTex = tex2D(_MainTex, i.uv); // 采样贴图 RGB颜色 A透贴
return var_MainTex; // 返回值
}
ENDCG
}
}
FallBack "Diffuse/"
}
常用模式
公式 | 模式 |
---|---|
Blend SrcAlpha OneMinusSrcAlpha | //Normal |
Blend OneMinusDstColor One | //Soft Additive |
Blend DstColor Zero | // Multiply |
Blend DstColor SrcColor | //2x Multiply |
Blend op Min | // Darken |
Blend One One | |
Blend op Max | // Lighten |
Blend One One | |
Blend OneMinusDstColor One | //Screen |
Blend One OneMinusSrcColor | //Same as above |
Blend One One | // Linear Dodge |