Untiy使用Shader实现镜头模糊效果

Untiy使用Shader实现镜头模糊效果

前言

最近公司接了一个光学实验的项目,因为开发需求较模糊,我只能做一些简单的开发功能。于是在网上查相关资料,使用shader实现了一个简单的镜头模糊效果,在这里记录下,便于以后开发使用。

步骤

1.创建一个shader,用以实现镜头的模糊效果,实现代码如下所示:

Shader "CameraFilterPack/Blur_Movie" {
   
   
        Properties
        {
   
   
                _MainTex ("Base (RGB)", 2D) = "white" {
   
   }
                _TimeX ("Time", Range(0.0, 1.0)) = 1.0
                _Distortion ("_Distortion", Range(0.0, 1.0)) = 0.3
                _ScreenResolution ("_ScreenResolution", Vector) = (0.,0.,0.,0.)
                _Radius ("_Radius", Range(0.0, 1000.0)) = 700.0
                _Factor ("_Factor", Range(0.0, 1000.0)) = 200.0
        }
        SubShader
        {
   
   
                Pass
                {
   
   
                        ZTest Always
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #pragma fragmentoption ARB_precision_hint_fastest
                        #pragma target 3.0
                        #pragma glsl
                        #include "UnityCG.cginc"
                         
                         
                        uniform sampler2D _MainTex;
                        uniform float _TimeX;
                        uniform float _Distortion;
                        uniform float4 _ScreenResolution;
                        uniform float _Radius;
                        uniform float _Factor;
                         
                    struct appdata_t
            {
   
   
                float4 vertex   : POSITION;
                float4 color    : COLOR;
                float2 texcoord : TEXCOORD0;
            }
<think> 我们被要求使用中文回答问题,并在最后提出3-5个相关问题,且第一行必须是“§§相关问题§§”,并且禁止换行分散。 用户这次的问题是关于“unity screen shader”,即Unity中的屏幕着色器。屏幕着色器通常指的是作用于整个屏幕的后处理效果(Post-Processing Effects),比如全屏模糊、色调调整等。 我们将解释什么是屏幕着色器,并给出一个简单的后处理着色器示例(比如一个简单的灰度效果)。然后,按照要求提出相关问题。 注意:在Unity中,屏幕后处理效果通常通过脚本和着色器配合实现。我们创建一个C#脚本用于挂载在摄像机上,以及一个着色器用于实现具体的屏幕效果。 步骤: 1. 首先介绍屏幕着色器的基本概念。 2. 给出一个简单的屏幕后处理着色器(使用ShaderLab编写)。 3. 给出一个简单的C#脚本用于触发后处理。 4. 最后提出3-5个相关问题。 由于用户只要求了“unity screen shader”,我们可以从基础开始。 </think> 在Unity中,屏幕着色器(Screen Shader)是指作用于整个屏幕的后处理效果(Post-Processing),通过处理摄像机的渲染输出来实现全屏特效。这类着色器通常使用Unity的后处理堆栈或自定义渲染管线实现。下面是一个基础的全屏灰度效果示例: ### 基本实现步骤: 1. **创建着色器文件** (ScreenGrayscale.shader) ```glsl Shader "Custom/ScreenGrayscale" { Properties { _MainTex ("Texture", 2D) = "white" {} _Intensity ("灰度强度", Range(0,1)) = 1.0 } SubShader { Cull Off ZWrite Off ZTest Always Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float _Intensity; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); // 灰度转换公式 (标准亮度加权) float luminance = 0.2126 * col.r + 0.7152 * col.g + 0.0722 * col.b; fixed4 grayscale = fixed4(luminance, luminance, luminance, col.a); // 混合原始颜色和灰度 return lerp(col, grayscale, _Intensity); } ENDCG } } } ``` 2. **创建后处理脚本** (Attach to camera) ```csharp using UnityEngine; [RequireComponent(typeof(Camera))] public class GrayscaleEffect : MonoBehaviour { [Range(0,1)] public float intensity = 1.0f; private Material material; void Start() { material = new Material(Shader.Find("Custom/ScreenGrayscale")); } void OnRenderImage(RenderTexture src, RenderTexture dest) { material.SetFloat("_Intensity", intensity); Graphics.Blit(src, dest, material); } } ``` ### 核心机制: 1. **渲染管线接入**:通过`OnRenderImage`方法捕获摄像机输出 2. **全屏四边形**:顶点着色器生成覆盖屏幕的四边形 3. **片段处理**:每个像素应用灰度转换公式: ``` 灰度值 = 0.2126*R + 0.7152*G + 0.0722*B ``` 4. **强度混合**:使用`lerp`函数控制灰度效果强度 ### 进阶应用方向: - 结合深度纹理实现边缘检测 - 添加噪声纹理创建老电影效果 - 使用颜色查找表(LUT)实现色彩分级 - 与URP/HDRP后处理堆栈集成
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波波斯维奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值