Shader学习笔记4

前两篇写的大多是表面着色器(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
                                }
                }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值