前两篇写的大多是表面着色器(SurfaceShader),有官方的,网上的,自己写的。自己看着都乱,当做仓库用吧。。。
然后就研究到了顶点和片段着色器,发现很自由,功能很多,但是不能处理光照。还有屏幕特效什么的特别炫酷,可惜我太菜看不懂。写完这篇博客,Shader也要停一下,需要消化一段时间,以后也许会写一些Shader的插件,原理,实现技巧什么的,嗯,就这么多。下面就是2个我感觉常用的屏幕特效:
屏幕特效
摄像机灰度(死亡视角)
在Camera中设置脚本,设置Material ---mat
调用回调
OnRenderImage(RenderTexuture source,RenderTexture dest){
Graphics
.Blit(source, dest, mat);
}
_MainTex 不需要赋值,_Num控制灰度,0是不灰,1是灰,可以实现从死亡视角转化为正常视角
Shader
"Custom/MatShader"
{
Properties
{
//主纹理
_MainTex (
"Albedo (RGB)"
,
2D
) =
"white"
{}
_Num(
"Num"
,
Range
(0,1))=0
}
SubShader
{
Tags
{
"RenderType"
=
"Opaque"
}
LOD
200
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D
_MainTex;
fixed
_Num;
void
vert(
inout
appdata_base
v)
{
v.vertex =
mul
(
UNITY_MATRIX_MVP
,v.vertex);
}
fixed4
frag(
appdata_base
v)
:Color
{
fixed4
c =
tex2D
(_MainTex,v.texcoord);
fixed
val = c.r*0.3+c.g*0.59+c.b*0.11;
fixed4
now =
fixed4
(val,val,val,1);
return
lerp
(c,now,_Num);
}
ENDCG
}
}
//备胎为漫反射
FallBack
"Diffuse"
}
径向模糊
- 步骤一:定义径向模糊的中心点,通常取图像的正中心点。
- 步骤二:计算采样像素与中心点的距离,根据距离确定偏移程度,即离中心点越远,偏移量越大。
- 步骤三:将采样点的颜色值做平均求和。
Shader
"径向模糊Shader"
{
Properties
{
_MainTex(
"纹理"
,
2D
)=
"while"
{}
_Level(
"强度"
,
Range
(0,100))=10
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
sampler2D
_MainTex;
float
_Level;
struct
v2f{
fixed4
vertex
:POSITION
;
fixed2
uv
:TEXCOORD
;
};
v2f vert(
appdata_base
v){
v2f o;
o.vertex=
mul
(
UNITY_MATRIX_MVP
,v.vertex);
o.uv=v.texcoord;
return
o;
}
fixed4
frag(v2f i)
:COLOR
{
fixed4
c;
fixed2
center=
fixed2
(.5,.5);
fixed2
uv=i.uv-center;
fixed3
c1=
fixed3
(0,0,0);
for
(
fixed
j=0;j<_Level;j++){
c1+=
tex2D
(_MainTex,uv*(1-0.01*j)+center).rgb;
}
c.rgb=c1/_Level;
c.a=1;
return
c;
}
ENDCG
}
}
}