本篇主要用于记录自己的实战操作,以及一些碎碎念(观后感),如果有什么好想法或者本篇出现什么错误,请多指教~
本篇的内容参考视频:庄懂的技术美术入门课(美术向)
使用软件:Unity 2019 3.6f1 ,ShaderForge
本篇内容主要包括:特效shader特点简述,透切,透混,透叠以及更多混合模式
一.特效特点
1.透
特效大部分都是透明或边缘不规则的,特效是需要一定通透性的,为了表现透常见的有下图的几种处理方法,在后面细说;
2.动
特效不是静止的插画,要表现一定的动感或者ACT中的打击感,为了表现特效的动感,常见操作如下图
3.映
坐标映射
二.透切
1.透切(ALphaCutout,也称为AlphaTest);
2.用途
- 常用于复杂轮廓,明确边缘的物体表现,如:镂空金属,裙摆边缘,特定风格下的头发,树叶,等;
- 卡通渲染特效表现,一般会配上后处理抗锯齿以及Bloom(辉光);
3.优点
无排序问题,不会看过去错位
4.缺点
- 边缘效果太实
- 移动端性能较差
5.代码
AC的代码与剩下两个非同一体系
Shader "Unlit/co11-AC"
{
Properties
{
_MainTex ("RGB:颜色 A:透贴", 2D) = "white" {}
_Cutoff ("透切阈值",range(0.0,1.0))= 0.5//AC特有
}
SubShader
{
Tags {
"RenderType" ="TransparentCutout"//对应改为Cutout(虽然不改在此处无用,但是为了规范以及其他情况可能使用,加上)
"ForceNoShadowCasting"="True" //特效里默认关闭阴影投影
"IgnoreProjector" ="True" //特效里默认不响应投射器
}
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform half _Cutoff;
struct appdata
{
float4 vertex : POSITION;
float2 uv0 : TEXCOORD0;
};
struct v2f
{
float2 uv0 : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.pos= UnityObjectToClipPos(v.vertex);
o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);
return o;
}
fixed4 frag (v2f i) : COLOR
{
half4 var_MainTex = tex2D(_MainTex, i.uv0);
half opacity = var_MainTex.a;
clip(opacity-_Cutoff);
return half4(var_MainTex);
}
ENDCG
}
}FallBack "Diffuse"
}
效果如下:
三.透混
1.全称透明度混合(ALphaBlend);
2.用途
- 常用于复杂轮廓,无明确边缘的物体表现,不适合空间关系复杂的效果;
- 常用于半透明的物体表现;
- 一般的特效表现,打底用;
3.优点
- 移动端性能较好;
- 边缘效果较好;
4.缺点
有排序问题,看起来会觉得错位;
5.代码
Shader "Unlit/co11-AB"
{
Properties
{
_MainTex ("RGB:颜色 A:透贴", 2D) = "white" {}
}
SubShader
{
Tags {
"Queue" = "Transparent" //加个渲染序列,调整渲染顺序
"RenderType" = "Transparent"
"ForceNoShadowCasting"= "True" //特效里默认关闭阴影投影
"IgnoreProjector" = "True" //特效里默认不响应投射器
}
Pass
{
Tags{"LightMode" = "ForwardBase"}
Blend One OneMinusSrcAlpha //修改混合方式,有两种写法,One可以替代为SrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform half _Cutoff;
struct appdata
{
float4 vertex : POSITION;
float2 uv0 : TEXCOORD0;
};
struct v2f
{
float2 uv0 : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.pos= UnityObjectToClipPos(v.vertex);
o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);
return o;
}
fixed4 frag (v2f i) : COLOR
{
half4 var_MainTex = tex2D(_MainTex, i.uv0);
return half4(var_MainTex);
}
ENDCG
}
}FallBack "Diffuse"
}
One效果(官方:传统)如下:
SrcAlpha效果(官方:预乘)如下:
四.透叠
1.透明度叠加(Additive,简称AD),特效的灵魂;
2.用途
- 常用于发光体,辉光表现;
- 一般特效表现,提高亮度使用;
3.问题:
- 排序问题;
- 多层叠加容易性能爆炸(OverDraw)
- 作为辉光效果可以用后处理Bloom来替代;
4.代码
比起AB主要改了下混合模式
Shader "Unlit/co11-AD"
{
Properties
{
_MainTex ("RGB:颜色 A:透贴", 2D) = "white" {}
}
SubShader
{
Tags {
"Queue" = "Transparent" //加个渲染序列,调整渲染顺序
"RenderType" = "Transparent"
"ForceNoShadowCasting"= "True" //特效里默认关闭阴影投影
"IgnoreProjector" = "True" //特效里默认不响应投射器
}
Pass
{
Tags{"LightMode" = "ForwardBase"}
Blend One One //AD版修改混合方式
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform half _Cutoff;
struct appdata
{
float4 vertex : POSITION;
float2 uv0 : TEXCOORD0;
};
struct v2f
{
float2 uv0 : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.pos= UnityObjectToClipPos(v.vertex);
o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);
return o;
}
fixed4 frag (v2f i) : COLOR
{
half3 var_MainTex = tex2D(_MainTex, i.uv0).rgb; // 采样贴图 RGB颜色 A透贴不必须
return half4(var_MainTex, 1.0); // 返回值
}
ENDCG
}
}FallBack "Diffuse"
}
效果如下:
三者对比,从左往右依次AC,AB(SrcAlpha),AD
五.更多混合模式
1.模式
2.原理
3.美术自定义混合面板
4.完全暴露的代码实现
- 思路
- 代码
相对于AB加了三个关于混合运算的参数以及用[Enum(UnityEngine.Rendering.BlendMode)]去做下拉菜单,并且在Blend混合模式那里处理了一下;
Shader "Unlit/co11-BlendMode"{
Properties
{
_MainTex ("RGB:颜色 A:透贴", 2D) = "white" {}
[Enum(UnityEngine.Rendering.BlendMode)]
_BlendSrc("混合源乘子" ,int) = 0
[Enum(UnityEngine.Rendering.BlendMode)]
_BlendDst ("混合目标乘子", int) = 0
[Enum(UnityEngine.Rendering.BlendMode)]
_BlendOp ("混合算符", int) = 0
}
SubShader
{
Tags {
"Queue" = "Transparent" //加个渲染序列,调整渲染顺序
"RenderType" = "Transparent"
"ForceNoShadowCasting"= "True" //特效里默认关闭阴影投影
"IgnoreProjector" = "True" //特效里默认不响应投射器
}
Pass
{
Tags{"LightMode" = "ForwardBase"}
BlendOp [BlendOp] //修改混合方式混合模式用,自定义混合算符
Blend [_BlendSrc] [_BlendDst] // 可自定义混合模式
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform half _Cutoff;
struct appdata
{
float4 vertex : POSITION;
float2 uv0 : TEXCOORD0;
};
struct v2f
{
float2 uv0 : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.pos= UnityObjectToClipPos(v.vertex);
o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);
return o;
}
fixed4 frag (v2f i) : COLOR
{
half4 var_MainTex = tex2D(_MainTex, i.uv0);
return half4(var_MainTex);
}
ENDCG
}
}FallBack "Diffuse"
}