Unity Shader屏幕后处理 运动模糊

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

原理

一种实现方法是利用一块累积缓存来混合多张连续的图像,当物体快速移动产生多张图像后,我们取它们之间的平均值作为最后的运动模糊图像。然而这种暴力的方法对性能的消耗很大.

另一种应用广泛的方法是创建和使用速度缓存,这个缓存中存储了各个像素当前的运动速度,然后利用该值来决定模糊的方向和大小.

我们使用类似上述第一种方法实现来模拟运动模糊的效果,我们不需要在一帧中把场景渲染多次,但需要保存之间的渲染结果,不断把当前的渲染图像叠加到之前的渲染图像中,从而产生一种运动轨迹的视觉效果,这样方法性能更好,但模糊效果可能会略差.

脚本实现:

using UnityEngine;
using System.Collections;

public class MotionBlur : PostEffectsBase
{

    public Shader motionBlurShader;
    private Material motionBlurMaterial = null;

    public Material material
    {
        get
        {
            motionBlurMaterial = CheckShaderAndCreateMaterial(motionBlurShader, motionBlurMaterial);
            return motionBlurMaterial;
        }
    }

    [Range(0.0f, 0.9f)]
    public float blurAmount = 0.5f;//模糊参数 数值越大,运动拖尾的效果越明显

    private RenderTexture accumulationTexture;//保存之前图像叠加的结果

    void OnDisable()
    {
        DestroyImmediate(accumulationTexture);//不运动时立刻调用销毁,希望在下一次开始新运动时重新叠加图像。
    }

    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        if (material != null)
        {

            if (accumulationTexture == null || accumulationTexture.width != src.width || accumulationTexture.height != src.height)
            {//判断是否为空,判断是否与当前的屏幕分辨率相等,如果不满足,重新创建一个
                DestroyImmediate(accumulationTexture);
                accumulationTexture = new RenderTexture(src.width, src.height, 0);
                accumulationTexture.hideFlags = HideFlags.HideAndDontSave;//不显示在hierarchy,也不保存到场景中
                Graphics.Blit
详解Unity中的粒子系统Particle System (九) 今天讲Texture Sheet Animation模块,先前我们已经讲了很多很多模块,通过上述模块可以实现很酷的效果,但是缺了一点真实感。比如说爆炸特效,仅指望单独的粒子来模拟真实的爆炸效果是不现实的,必须要有素材辅助。就像是复杂模型必须要有纹理贴图一样,复杂的粒子效果也要有纹理辅助,且可以是动态纹理(纹理序列)。 阅读详情

相关推荐

Unity技巧】调整画质(贴图)质量

写在前面 当我们在Unity中,使用图片进行2D显示时,会发现显示出来的画面有明显的模糊或者锯齿,但是美术给的原图却十分清晰。 要改善这一状况实际上很简单。 造成这样的原因,是Unity在导入图片(或者纹理)时会自动进行压缩,以便减少运行时游戏的内存占用率,提供性能。 注意:下面实例使用的Unity版本为4.3.4。版本不同的话可能某些显示不完全相同,但关键...

weixin_33735077的博客 3604

Unity动态模糊理论和实现

这告诉我们要如何做动态模糊,需要将当前点和之前若干像素取平均值。这有个隐含参数是需要平均的像素点的个数N,这取决于曝光时间,时间越长,t越大需要平均的像素点越多。动态模糊-历史缓存Blend 首先是比较简单的实现方式,从原理分析出发,那么可以保存这N帧的图像然后对相邻N帧取平均。但直接创建N个缓存贴图成本太高,可以只使用一个缓存用Blend代替另外一种方法不需要使用中间缓存,而是作为一种后处理效果直接在屏幕空间实现,需要计算速度向量,根据重投影来计算像素速度

paserity的博客 2445

Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果

Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1992/article/ 书籍链接:http://product.dangdang.com/23972910.html第12章 屏幕后处理效果屏幕后处理效果(screen post-process

那远远的云端 3930

UnityShader入门精要——运动模糊

运动模糊是真实世界中的摄像机的一种效果。如果在摄像机曝光时,拍摄场景发生了变化,就会产生模糊的画面。 运动模糊的实现有多种方法。一种实现方法是利用一块累积缓存(accumulation buffer )来混合多张连续的图像。当物体快速移动产生多张图像后,我们取它们之间的平均值作为最后的运动模糊图像。然而,这种暴力的方法对性能的消耗很大,因为想要获取多张帧图像往往意味着我们需要在同一帧里渲染多次场景。另一种应用广泛的方法是创建和使用速度缓存(velocity buffer),这个缓存中存储了各个像素当前的运

weixin_51327051的博客 3091

Unity游戏画面参数解析与应用:垂直同步、动态模糊、抗锯齿

前言 大学同学在群里分享了一张关于原神画面设置的图片: 其中一项垂直同步默认是打开的,但是似乎不是那么合理,所以在这里描述一下关于垂直同步的一些知识: 一、 垂直同步: 在Unity中,如果想要开启垂直同步,可以在Quality下面找到Vsync Count,而关于其对应的三个选项分别为: Don’t Sync:不需要垂直同步 Every V Blank:开启垂直同步 Every Second V Blank:每隔一个垂直空白同步 也可以直接通过脚本中的API来直接控制: public stati

xinzhilinger的博客 8490

(十三)unity shader之——————屏幕后处理效果(运动模糊)

运动模糊是真实世界中摄像机的一种效果,如果在摄像机曝光时,拍摄场景发生了变化,就会产生运动模糊的画面。运动模糊效果可以让物体运动看起来更加真实平滑,但在计算机产生的图像中,由于不存在曝光这一物理现象,渲染出来的图像往往都棱角分明,缺少运动模糊。 下图是运动中的原效果: 下图是运动模糊效果: 运动模糊的实现有多种方法,一种实现方法是利用多张连续的图像,当物体快速移动产生多张图像后,我...

cgy56191948的博客 1015

Unity Shader 屏幕后处理 运动模糊 累计模糊

效果 代码 using UnityEngine; public class MotionBlur : PostEffectsBase { public Shader motionBlurShader; private Material motionBlurMaterial = null; public Material material { ...

songhuanfei2017的博客 469

Unity Shader 屏幕后处理 运动模糊 速度映射图

代码 using UnityEngine; public class MotionBlurWithDepthTexture : PostEffectsBase { public Shader motionBlurShader; private Material motionBlurMaterial = null; public Material material ...

songhuanfei2017的博客 422

Unity Shader入门精要》学习--高级篇--丰富的屏幕后处理效果

本文介绍了Unity中常见的屏幕后处理效果实现方法,包括亮度/饱和度/对比度调整、边缘检测、高斯模糊、Bloom效果和运动模糊。文章详细讲解了它们的原理和实现步骤:通过OnRenderImage和Graphics.Blit等API对渲染完成的图像进行二次处理;使用卷积核进行边缘检测和高斯模糊;通过亮度阈值提取亮部并模糊实现Bloom效果;采用累积叠加方式实现运动模糊。每种效果都配有对应的Shader和脚本实现代码,并展示了最终效果图。文章还总结了屏幕后处理的核心技术点,如卷积计算、Pass复用、混合模式设置

misco43的博客 1725

Unity Shader学习记录(19) ——屏幕后处理效果

屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行系列操作,实现各种屏幕特效。使用这种技术,可以为游戏画面添加更多的艺术效果,例如景深(DepthofField)、运动模糊(Motion Blur)等。

weixin_45810196的博客 1464

UnityShader[3]屏幕后处理学习笔记

大致学习了画面滤镜、边缘检测、模糊、bloom、深度操作等功能的原理和实现

Thanatos_Left的博客 1577

Shader入门精要笔记-屏幕后处理效果(1)

屏幕后处理:指的是在渲染完整个场景得到屏幕图形后,对图形进行一系列操作,实现各种屏幕特效如:景深,运动模糊基础在于:得到渲染后的屏幕图像,即抓取屏幕

muziiii的博客 1255

shader-屏幕后处理

屏幕后处理 在渲染完整个场景得到屏幕图像后,再对这个图像进行处理,实现各种特效。在渲染后的屏幕图像,即抓屏,OnRenderImage函数接口可以对该图像进行操作返回最终的图像,利用Graphics.Blit()函数处理图片。默认情况下,OnRenderImage在透明和不透明的pass执行完后被调用。大致的流程:向摄像机添加脚本--》实现OnRenderImage函数--》调用Graphics...

birdswillbecomdragon的博客 375

Unity屏幕后处理进阶:Bloom、运动模糊、景深与性能优化实战

屏幕后处理是实时渲染中实现全局视觉效果的关键技术,其核心原理是在相机完成场景渲染后,对最终图像进行像素级的二次加工。通过操作颜色、深度等缓冲区信息,开发者能够在不修改原始模型与材质的前提下,高效地实现风格化与画面增强。从提升视觉冲击力的Bloom(泛光)效果,到增强动态真实感的运动模糊,再到引导视觉焦点的景深模拟,这些技术为游戏画面增添了电影级的质感与艺术表现力。在工程实践中,性能优化至关重要,涉及降低处理分辨率、合并渲染Pass、利用计算着色器等策略,以确保在移动端与PC端都能流畅运行。本文以构建一个复古

weixin_33519829的博客 261

UnityShader学习笔记 屏幕后处理效果

屏幕后处理脚本系统 using System.Collections; using System.Collections.Generic; using UnityEngine; [ExecuteInEditMode] [RequireComponent(typeof(Camera))] public class PostEffectsBase : MonoBehaviour { protected void CheckResources() { bool isSuppo

漫漫无期的博客 626

Unity-shader学习笔记(八)

文章目录Unity-shader学习笔记(八)18 屏幕后处理效果18.1 建立一个基本的屏幕后处理脚本系统18.2 调整屏幕亮度、饱和度和对比度18.3 边缘检测18.3.1 什么是卷积18.3.2 常见的边缘检测算子18.3.3 实现18.4 高斯模糊18.4.1 高斯滤波18.4.2 实现18.5 Bloom特效18.6 运动模糊19 使用深度和法线纹理19.1 获取深度和法线纹理19.1.1 背后的原理19.1.2 如何获取19.2 使用深度和法线纹理实现运动模糊19.3 全局雾效19.3.1 重建

weixin_45720322的博客 688

shader入门精要读书笔记35 使用深度纹理获取像素速度来控制运动模糊

一、运动模糊 之前说的两种方式:运动模糊实现 一种是累积缓存,来混和多张连续的图像,消耗性能。 还有一种是采用速度缓存,这个缓存存储了各个像素当前的运动速度,然后使用该值决定模糊的方向和大小。 速度缓存就是通过深度纹理逆运算得出NDC坐标再乘以逆矩阵从而还原出世界空间中的坐标,再使用上一帧的变换矩阵乘以坐标来得到上一帧的NDC坐标,然后根据两个NDC坐标计算像素速度,从而使用速度对主纹理进行相邻像...

Chgmaker的博客 355

UnityShader入门精要学习笔记】第十二章 屏幕后处理效果

简单的来说,使用卷积我们可用以某个像素为中心的周围像素进行权值计算,并讲处理后的值重新赋值给中心像素。其中这个由权值构成的矩阵被称为卷积核(kenel)。通过卷积操作,我们可以对图像进行一系列的处理,如图像模糊,边缘检测,颜色均值等等操作。

milu_ELK的博客 1897

屏幕后处理技术

屏幕后处理定义:就是渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。屏幕后处理实现过程:首先需要在摄像机上添加一个用于屏幕后处理的脚本。在这个脚本中,我们会实现MonoBehaviour.OnRenderImage函数来获取当前屏幕的渲染纹理。然后再调用Graphics.Blit函数使用特定的Unity Shader对当前的图像进行处理,再把返回的渲染纹理显示到屏幕上。明

zjz 2716
上一篇: Unity Shader屏幕后处理 Bloom效果
下一篇: Unity Shader使用深度纹理实现运动模糊
vvc223c
博客等级 码龄8年 67粉丝 350原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值