ZoomBlur 聚焦模糊效果Shader(URP)

 修改自这篇文章【Unity】UniversalRPでカスタムポストプロセスを作る【ZoomBlur】 - Qiita

 1. VolumeEditor,用于在UnityVolume中控制自己写的后处理效果

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;[System.Serializable, VolumeComponentMenu("Dejavu/ZoomBlur")]
public class ZoomBlurVolume : VolumeComponent, IPostProcessComponent
{[Range(0f, 100f), Tooltip("强度")]public FloatParameter focusPower = new FloatParameter(0f);[Range(0, 10), Tooltip("模糊层数")]public IntParameter focusDetail = new IntParameter(5);[Tooltip("聚焦焦点")]public Vector2Parameter focusScreenPosition = new Vector2Parameter(Vector2.zero);public bool IsActive() => focusPower.value > 0f;public bool IsTileCompatible() => false;
}

2. RenderFeature和RenderPass

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;public class ZoomBlurRenderFeature : ScriptableRendererFeature
{ZoomBlurPass zoomBlurPass;public override void Create(){zoomBlurPass = new ZoomBlurPass(RenderPassEvent.BeforeRenderingPostProcessing);}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){zoomBlurPass.Setup(renderer.cameraColorTarget);renderer.EnqueuePass(zoomBlurPass);}
}public class ZoomBlurPass : ScriptableRenderPass
{static readonly string k_RenderTag = "Render ZoomBlur Effects";static readonly int MainTexId = Shader.PropertyToID("_MainTex");static readonly int TempTargetId = Shader.PropertyToID("_TempTargetZoomBlur");static readonly int FocusPowerId = Shader.PropertyToID("_FocusPower");static readonly int FocusDetailId = Shader.PropertyToID("_FocusDetail");static readonly int FocusScreenPositionId = Shader.PropertyToID("_FocusScreenPosition");ZoomBlurVolume zoomBlur;Material zoomBlurMaterial;RenderTargetIdentifier currentTarget;public ZoomBlurPass(RenderPassEvent evt){renderPassEvent = evt;var shader = Shader.Find("PostEffect/ZoomBlur");if (shader == null){Debug.LogError("Shader not found.");return;}zoomBlurMaterial = CoreUtils.CreateEngineMaterial(shader);}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){if (zoomBlurMaterial == null){Debug.LogError("Material not created.");return;}if (!renderingData.cameraData.postProcessEnabled) return;var stack = VolumeManager.instance.stack;zoomBlur = stack.GetComponent<ZoomBlurVolume >();if (zoomBlur == null) { return; }if (!zoomBlur.IsActive()) { return; }var cmd = CommandBufferPool.Get(k_RenderTag);Render(cmd, ref renderingData);context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}public void Setup(in RenderTargetIdentifier currentTarget){this.currentTarget = currentTarget;}void Render(CommandBuffer cmd, ref RenderingData renderingData){ref var cameraData = ref renderingData.cameraData;var source = currentTarget;int destination = TempTargetId;var w = cameraData.camera.scaledPixelWidth;var h = cameraData.camera.scaledPixelHeight;zoomBlurMaterial.SetFloat(FocusPowerId, zoomBlur.focusPower.value);zoomBlurMaterial.SetInt(FocusDetailId, zoomBlur.focusDetail.value);zoomBlurMaterial.SetVector(FocusScreenPositionId, zoomBlur.focusScreenPosition.value);int shaderPass = 0;cmd.SetGlobalTexture(MainTexId, source);cmd.GetTemporaryRT(destination, w, h, 0, FilterMode.Point, RenderTextureFormat.Default);cmd.Blit(source, destination);cmd.Blit(destination, source, zoomBlurMaterial, shaderPass);}
}

 3.Shader

Shader "PostEffect/ZoomBlur"
{Properties{_MainTex("Texture", 2D) = "white" {}}SubShader{Cull Off ZWrite Off ZTest AlwaysTags { "RenderPipeline" = "UniversalPipeline"}Pass{CGPROGRAM#pragma vertex Vert#pragma fragment Fragsampler2D _MainTex;float2 _FocusScreenPosition;float _FocusPower;int _FocusDetail;int _ReferenceResolutionX;struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};v2f Vert(appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;return o;}float4 Frag(v2f i) : SV_Target{//_FocusScreenPosition 范围是(-width/2,-height/2) 到( width/2, height/2) ,(0,0)变换到屏幕中心为(_ScreenParams.xy / 2)float2 focusPos = _FocusScreenPosition + _ScreenParams.xy / 2;float2 uv = i.uv;//根据屏幕坐标计算UVfloat2 focusPosUV = (focusPos / _ScreenParams.xy);//计算像素点距离中心焦点的UV差,以中心点乘系数外扩uv = uv - focusPosUV;float4 outColor = float4(0, 0, 0, 1);//多层模糊for (int i = 0; i < _FocusDetail; i++) {//计算模糊的强度,也就是UV的偏移强度float power = 1.0 - _FocusPower/1000 * float(i);//以中心点乘系数外扩outColor.rgb += tex2D(_MainTex , uv * power + focusPosUV).rgb;}outColor.rgb *= 1.0 / float(_FocusDetail);return outColor;}ENDCG}}
}

工程示例链接:git@github.com:Dejavu0709/StudyForShader.git  中的ZoomBlure文件夹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

魅蓝s6启动android密码_魅蓝s6怎么恢复出厂设置?忘记密码怎么办

魅蓝s6怎么恢复出厂设置&#xff1f;忘记密码怎么办&#xff1f;手机是现代生活必不可少的工具之一&#xff0c;在使用时我们常常会忘记手机密码。本次就给大家介绍手机密码忘了怎么恢复出厂设置&#xff0c;快来看看吧。我们知道手机恢复出厂设置的注意事项最重要的就是做好手…

漫游飞行_魔兽世界:德拉诺时光周 冲声望解锁德拉诺飞行好时机

虽然德拉诺飞行开放已经是6.22版本的事情了&#xff0c;但是目前还是有些玩家还没有解锁。但是本周德拉诺时光周的开放&#xff0c;获取德拉诺飞行声望将会更加简单。德拉诺飞行声望德拉诺飞行解锁需要先知之手(部落是沃金之锋)、觉醒教派和刃牙追猎者三个声望达到崇敬。而在本…

python怎么解释语言_python是解释型语言吗

Python 是解释型的语言吗&#xff1f;它会被编译吗&#xff1f; 这个问题没有想象中那么好回答。和很多人认识世界一样&#xff0c;习惯以一个简单的模型去评判一些事物。而事实上&#xff0c;里面包含了很多很多的细节。通常的说法&#xff0c;编译代表着将一个高级语言转化为…

第一次失效_神兵小将:净化之力失效地魔兵兽,全靠特殊办法,铁心方式真霸气...

神兵小将&#xff1a;净化之力失效地魔兵兽&#xff0c;全靠特殊办法&#xff0c;铁心方式真霸气。在经典动漫神兵小将中&#xff0c;魔兵兽在漫迷眼中属于比较特殊的存在&#xff0c;很多人气指数超高的神兵兽被魔化后却成为阻碍问天前进的高山。因此魔兵兽在很大意义上讲也是…

Python 每日定时查询数据库生成Excel报表,并群发邮件

最近在做游戏打点数据的一些统计处理&#xff0c;写了个Python脚本完成每日定时自动查询生成Excel报表并群发邮件的小功能。 拆解几个需求点&#xff1a; 一.连接数据库并查询 以下是一个查询总注册人数的示例代码&#xff0c;host port db user password等填入自己数据库的…

com口驱动_Ubuntu 安装Nvidia显卡驱动指南

该文档适用于&#xff1a; Ubuntu 14/16/18 三个版本。Nvidia显卡驱动适用于&#xff1a;RTX2080TI/RTX2080/RTX2070/GTX1080TI/GTX1080/GTX1070以及更低级别显卡。本文档旨在帮助大家解决安装Nvidia显卡遇到的常见问题。Nvidia驱动下载地址&#xff1a;https://www.geforce.co…

Unity URP中根据深度重建世界坐标

通过深度值重建世界坐标&#xff0c;可以做出很多有意思的后处理效果&#xff0c;先实现下度值重建世界坐标这个功能。 一.验证重建效果 首先&#xff0c;得先找到一种证明反推回世界空间位置正确的方法。在相机前摆放几个物体&#xff0c;尽量使之在世界坐标下的位置小于1&a…

dubbo yml配置_Spring boot 的profile功能如何实现多环境配置自动切换

通常服务端应用开发需要经过以下几个流程&#xff1a;开发 -> 测试 -> RC验证 -> 上线这就涉及到四个不同的环境&#xff0c;开发环境、测试环境、RC环境以及生产环境&#xff0c;为了避免不同环境之间相互干扰&#xff0c;通常需要独立部署数据库、缓存服务器等&…

Unity中的SystemInfo.deviceUniqueIdentifier 唯一ID

做游戏时可能经常使用SystemInfo.deviceUniqueIdentifier作为用户的唯一ID进行注册登录&#xff0c; 但是你会发现从谷歌商店上下载的自己游戏&#xff0c;和自己从Unity工程中直接打包出来的游戏账号竟然是不一致的&#xff01; 这个坑还是很坑爹的&#xff0c;纠其原因是Sy…

sketchup生成面域插件_独家教程 | 快速抓取“高精准”场地信息,康石石教你生成不同“体量”地形...

无论建筑设计还是景观设计&#xff0c;同学们的设计项目都必须依托于场地来进行&#xff0c;通过分析场地的区位范围、地形地势&#xff0c;结合场地的局限性与可能性&#xff0c;才能进一步展开项目设计。可以说&#xff0c;获取场地信息是同学们在作品集创作中最重要的环节之…

Unity URP高度雾效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现&#xff08;LinearDepth&#xff0c;Reverse Z&#xff0c;世界坐标重建&#xff0c;软粒子&#xff0c;高度雾&#xff0c;运动模糊&#xff0c;扫描线效果&#xff09;_puppet_master的专栏-CSDN博客_shader深度…

无限重启_三星蓝光播放器出现无限自动重启BUG,涉及不少用户及不同型号

三星的蓝光播放器似乎遇到了一个挺严重的BUG&#xff0c;使得不少用户都开机后播放器会自动不停重启。从reddit、ZDNet以及三星技术支持论坛上面的情况来看&#xff0c;这次的问题波及不同型号的播放器&#xff0c;大部分用户遇到的问题都是不停重启。其中一位用户表示:“开机之…

python getattr_Python 内置方法和属性应用:反射和单例

1. 前言python除了丰富的第三方库外&#xff0c;本身也提供了一些内在的方法和底层的一些属性&#xff0c;大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性&#xff0c;在本文中和大家做下分享。2. 内置…

Unity URP世界空间后处理扫描圈效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现&#xff08;LinearDepth&#xff0c;Reverse Z&#xff0c;世界坐标重建&#xff0c;软粒子&#xff0c;高度雾&#xff0c;运动模糊&#xff0c;扫描线效果&#xff09;_puppet_master的专栏-CSDN博客_shader深度…

前端 重构时需要注意的事项_前端数据层落地实践

源宝导读&#xff1a;天际移动平台经过重构改版&#xff0c;近期正式发布了1.0版本&#xff0c;我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面&#xff0c;给大家分享一下统一数据层方案的设计思…

postconstruct_@PostConstruct注解,你该好好看看

在最近的工作中&#xff0c;get到一个很实用的注解&#xff0c;分享给诸位。痛点做过微信或支付宝支付的童鞋&#xff0c;可能遇到过这种问题&#xff0c;就是填写支付结果回调&#xff0c;就是在支付成功之后&#xff0c;支付宝要根据我们给的地址给我们进行通知&#xff0c;通…

Unity URP运动模糊效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现&#xff08;LinearDepth&#xff0c;Reverse Z&#xff0c;世界坐标重建&#xff0c;软粒子&#xff0c;高度雾&#xff0c;运动模糊&#xff0c;扫描线效果&#xff09;_puppet_master的专栏-CSDN博客_shader深度…

线性系统的频率响应分析实验报告_动态系统的建模与分析

参考&#xff1a;DR_CAN1.介绍解决一个控制系统的问题&#xff1a;对研究对象进行分析控制器设计测试分析被控对象的物理特性及动态表现&#xff0c;在这个基础上建立数学模型&#xff0c;数学模型可以是动力学模型、热力学模型、流体力学模型和经济学模型等&#xff0c;然后在…

android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)

在上篇文章&#xff1a;warmcheng&#xff1a;Android生命周期组件 Lifecycle 使用详解​zhuanlan.zhihu.com中&#xff0c;我们讲了 Lifecycle 的简单使用&#xff0c;本篇我们来研究下它的源码。 基础环境搭建首先&#xff0c;按照上篇文章所讲&#xff0c;快速搭建环境。添加…

Leetcode1143. 最长公共子序列(c#)

题解&#xff1a;力扣 public class Solution{public int LongestCommonSubsequence(string text1, string text2){int num1 text1.Length;int num2 text2.Length;int[,] dp new int[num1 1, num2 1];for(int i 0; i < num1; i){for(int j 0; j < num2; j){if(t…