Unity3D教程宝典之Shader篇:第二十五讲Blur

转载自风宇冲Unity3D教程学院

Blur模糊其实理解了以后非常简单。核心原理就是
1个点的颜色 并不用该点的颜色,而是用该点周围所有点的均值
(1)确定取点范围, 例如周围3个像素 或者周围10个像素
(2)确定各点权重,这也是高斯模糊的由来,主要颜色分配的比重为正态分布,即高斯分布。

例子1:最简单的模糊
(1)新场景,plane上面放一张贴图
(2)plane上的shader如下

Shader "Custom/ObjectBlur" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader
    {
         Tags{"Queue"="Transparent"}

        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            sampler2D _MainTex;
            float4 _MainTex_ST;
            float uvOffset;

            struct v2f {
                float4  pos : SV_POSITION;
                float2  uv : TEXCOORD0;
            } ;
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
                o.uv =  TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                float4 s1 = tex2D(_MainTex,i.uv + float2(uvOffset,0.00));
                float4 s2 = tex2D(_MainTex,i.uv + float2(-uvOffset,0.00));
                float4 s3 = tex2D(_MainTex,i.uv + float2(0.00,uvOffset));
                float4 s4 = tex2D(_MainTex,i.uv + float2(0.00,-uvOffset));

                float4 texCol = tex2D(_MainTex,i.uv);
                float4 outp;

                float pct=0.2;
                outp = texCol* (1- pct*4) + s1* pct + s2* pct+ s3* pct + s4* pct;
                return outp;
            }
            ENDCG
        }
    }
}

  

以及BlurManager.cs脚本,如下

using UnityEngine;
using System.Collections;
public class BlurManager : MonoBehaviour {
    private float length =3f;
    private float showTime = -100;
    private float hideTime = -100;
    void Update () {
        if(showTime >0)
        {
            showTime -= Time.deltaTime;
            Shader.SetGlobalFloat("uvOffset", (showTime/length) * 0.005f);
        }

        if(hideTime >0)
        {
            hideTime -= Time.deltaTime;
            Shader.SetGlobalFloat("uvOffset", (1- hideTime/length) * 0.005f);
        }
    }

    void OnGUI()
    {
        if(GUI.Button(new Rect(0,0,100,50),"Show"))
        {
            showTime = length;
        }

        if(GUI.Button(new Rect(100,0,100,50),"Hide"))
        {
            hideTime = length;
        }
    }
}

  

运行后,点击show按钮,图会从模糊变清晰,点击hide按钮会从清晰变模糊。
这基本是最简单的模糊了,取本点 和其上下左右的4个偏移点。各点权重均为0.2。uv偏移从0至0.005
效果如下图还不错。

原图

模糊后的效果

参考文章

时间: 2024-10-09 19:56:11

Unity3D教程宝典之Shader篇:第二十五讲Blur的相关文章

Unity3D教程宝典之Shader篇:第五讲LOGO闪光效果

转载自风宇冲Unity3D教程学院 这个效果在很多LOGO及广告宣传中都会用到.商业开发的做法应该是拿一张闪光的图,对其做uv移动,然后和原图两张图混合,这样运算会小很多,需要储存的变量也会小很多.本讲不用图而完全通过计算得出闪光区域,主要是借此加深uv计算实现特殊效果的实现,以及计算uv的方法.代码注释配合图解已经比较详细了,跟着做就行,随便找一张半透明的图来做地图即可. Shader "Custom/logo" { Properties { _MainTex ("Text

Unity3D教程宝典之Shader篇

教程目录 基础讲:Shader学习方法基础讲:基础知识特别讲:常见问题解答特别讲:CG函数 第一讲: Shader总篇第二讲: Fixed Function Shader 第三讲: Vertex&Fragment Shader基础 第四讲: 制作一个美丽的地球第五讲:LOGO闪光效果 第六讲:TexGen第七讲:流程图第八讲:Why CG?第九讲:Render Path第十讲:雾化第十一讲:阴影面剔除及深度测试第十二讲:alpha测试第十三讲:alpha混合第十四讲:Surface Shader

Unity3D教程宝典之Shader篇:第二十讲法线贴图

转载自风宇冲Unity3D教程学院 上一讲我们讲了凹凸贴图以及生成法线贴图. 这一讲来谈谈怎么使用法线贴图. 一:法线贴图的原理 二:法线贴图的实现 三:法线贴图的使用 四:法线贴图的格式 一:法线贴图的原理 光照效果很大程度上是由垂直于物体表面的法线决定的,因为法线影响反射光的方向.均匀垂直的法线是镜面贴图.但是有时候我们会给一个平面使用砖墙贴图,砖墙应该是凹凸不平的,而如果让砖墙使用该平面的法线的话,画面就会很假,神马?一面墙像镜子一样反光=.= 而如果按真实砖墙去做模型的话,即做高精度模型

Unity3D教程宝典之Shader篇:第二十四讲Reflection Mapping

转载自风宇冲Unity3D教程学院 简介 Reflection Mapping,又叫Environment Mapping.对应TexGen的SphereMap和CubeReflect.是最快的reflect周围环境的算法 最早出现的是Sphere Mapping,之后被Cube Mapping取代.Reflection Mapping比射线追踪(Ray Tracing)高效得多 Reflection Mapping的前提是2个假设 (1)入射线来自无限距离 (2)物体是凸的,没有自身的相互反射

Unity3D教程宝典之Shader篇:第二十六讲ImageEffects_Twirl

转载自风宇冲Unity3D教程学院 Twirl是一个全屏画面扭曲的效果,新仙剑的战斗切换有用到这个效果. 主要有三个设置: center  扭曲的中心点 radius 扭曲的范围 angle 扭曲的角度 用到了如下函数 Matrix4x4.TRS(Vector3 pos, Quaternion rotate,Vector3 scale) 创建一个包括位移,旋转,缩放的矩阵 Matrix4x4 rotationMatrix = Matrix4x4.TRS(Vector3.zero, Quatern

Unity3D教程宝典之Shader篇:第二十二讲MultiPass

转载自风宇冲Unity3D教程学院 实现高级效果时,往往需要用到多个Pass. 用AlphaBlend混合例1:将一张图 分别用红色 和 绿色渲染并混合 (1)新建场景新建一个plane(2)新建一个material并随便赋张贴图,并让plane使用该materialmaterial所使用的shader如下 Shader "Custom/MyMultiPass" { Properties { _MainTex ("Base (RGB)", 2D) = "w

Unity3D教程宝典之Shader篇:第二十三讲GrabPass

转载自风宇冲Unity3D教程学院 GrabPass是一种特殊的pass类型.当物体将要被绘制时,它抓取屏幕内容并绘制到一张texture里.总体来说GrabPass开销较大,不如 AlphaBlend等指令.故能用AlphaBlend等指令实现的效果尽量用指令,不得不用GrabPass时才用GrabPass. (1)GrabPass{} 抓取当前屏幕内容,每次使用的开销都非常昂贵. texture用_GrabTexture获取(2)GrabPass{"TextureName"}将抓取

Unity3D教程宝典之Shader篇:第二讲Fixed Function Shader

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 Fixed function shader简介:  属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的情况.使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似. 例一:显示单一颜色下面我们来看第一个例子,显示单一颜色,注释写得挺详细了,照着格式写即可. //根Shader Shader "Custom/1_1color" { // 属性 Propertie

Unity3D教程宝典之Shader篇:第十二讲 Alpha测试

转载自风宇冲Unity3D教程学院 引言:本讲和下一讲主要讲Alpha即透明通道有关的内容.RGBA,其中最终在屏幕上显示的只有RGB即 红绿蓝组成的颜色,Alpha并没有任何颜色显示.A只是辅助颜色运算特别是多图层运算而已.例如在单图层的情况下(1,1,1,0.8)输出的是(1,1,1)*0.8即 浅灰色(0.8,0.8,0.8),和(0.8,0.8,0.8)是等价的.但是假如不再是单图层而背景为绿色(0,1,0,1)的时候,(0.8,0.8,0.8)就不知道怎么去运算了,而(1,1,1,0.