UnityShader开发之径向模糊(实现镜头中间不模糊,四周模糊的效果)

1.因为项目中需要中间清晰四周模糊的效果

对场景模型有效果对UI没有效果

实现效果

效果图(这是拖出来的3D图片)没模糊前

 

 

 效果图 模糊后(中间清晰,四周模糊,中间大小可调节)

 

 

首先是shader脚本

复制代码
Shader "Custom/GaoShiMoHu"
{
    Properties{
        _MainTex("纹理",2D) = "while"{}
        _Level("强度",Range(1,100)) = 10
        _CenterX("中心X坐标",Range(0,1)) = 0.5
        _CenterY("中心Y坐标",Range(0,1)) = 0.5
        _BufferRadius("缓冲半径",Range(0,1)) = 0
    }
        SubShader{
            Tags { "RenderType" = "Opaque" }

            Pass{
                CGPROGRAM
                #pragma vertex vert  
                #pragma fragment frag  

                #include "UnityCG.cginc"  

                sampler2D _MainTex;
                float _Level;
                float _CenterX;
                float _CenterY;
                float _BufferRadius;

                struct v2f {
                    fixed4 vertex : POSITION;
                    fixed2 uv : TEXCOORD;
                };

                v2f vert(appdata_base v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = v.texcoord;
                    return o;
                }

                fixed4 frag(v2f i) :COLOR
                {

                    fixed4 finalColor;
                    fixed2 center = fixed2(_CenterX,_CenterY);
                    fixed2 uv = i.uv - center;
                    fixed3 tempColor = fixed3(0,0,0);
                    fixed blurParams = distance(i.uv,center);

                    for (fixed j = 0;j < _Level;j++) {
                        tempColor += tex2D(_MainTex,uv*(1 - 0.01*j*saturate(blurParams / _BufferRadius)) + center).rgb;
                    }

                    finalColor.rgb = tempColor / _Level;
                    finalColor.a = 1;
                    return finalColor;
                }

                ENDCG
                }
        }
            FallBack "Diffuse"
                
}
复制代码

第二步 是C#脚本

挂在Camera上面 

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//什么模式都可以运行  ExecuteInEditMode
[ExecuteInEditMode]
public class ImageEffect_GaussianBlur : MonoBehaviour
{
    public Shader RadiaBlurShader;
    [HideInInspector]
    public Material RadiaBlurMaterial;

    [Range(1, 100)]
    public float Level = 10;

    [Range(0, 10)]
    public float BufferRadius = 0.5f;

    [Range(0, 1)]
    public float CenterX = 0.5f;

    [Range(0, 1)]
    public float CenterY = 0.5f;

    private void Awake()
    {
        RadiaBlurMaterial = new Material(RadiaBlurShader);
    }

    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (RadiaBlurMaterial != null)
        {
            RadiaBlurMaterial.SetFloat("_Level", Level);
            RadiaBlurMaterial.SetFloat("_CenterX", CenterX);
            RadiaBlurMaterial.SetFloat("_CenterY", CenterY);
            RadiaBlurMaterial.SetFloat("_BufferRadius", BufferRadius);

            Graphics.Blit(src, dest, RadiaBlurMaterial);
        }
        else
        {
            Graphics.Blit(src, dest);
        }
    }
}
复制代码

最后shader拖上去即可

 

posted @   剑起苍穹  阅读(1352)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
/*鼠标点击特效*/
点击右上角即可分享
微信分享提示