【实现100个unity特效之16】unity2022之前或者之后版本实现全屏shader graph的不同方式 —— 适用于人物受伤红屏或者一些其他状态效果

最终效果

在这里插入图片描述

文章目录

  • 最终效果
  • 前言
  • unity2022版本 Fullscreen shader graph
    • 首先,请注意你的Inity版本,是不是2022.2以上,并且项目是URP项且
    • 基本配置
  • 修改shader graph
    • 边缘效果
    • 动起来
    • 优化
    • 科幻风
    • 制作一些变量
    • 最终效果
    • 最终节点图
    • 代码控制
  • 2022之前版本
    • 下载 Blit Render Feature 脚本
  • 不使用shader graph
  • 参考
  • 完结

前言

今天和大家一起来学习一下unity2022版本新出的全屏shader graph,如果在2022之前想要实现全屏shader,可能还需要自己写脚本,但是在2022.2的版本之后,unity将它纳入了进来。

unity2022版本 Fullscreen shader graph

首先,请注意你的Inity版本,是不是2022.2以上,并且项目是URP项且

基本配置

紧接着我们创建一个Fullscreen shader graph
在这里插入图片描述
下面我们就要使用它了,修改URP配置,添加Full Screen Pass Renderer Feature
在这里插入图片描述
将我们shader相关的全屏材质给到Pass Material
在这里插入图片描述
这时你会发现Game视图变成了灰色
在这里插入图片描述

修改shader graph

创建极坐标节点,分离他的输出,输出的R就是中间黑四周白的渐变,然后将它通过乘幂函数进行调整,让黑色区域更大
在这里插入图片描述
我们需要将shader的Blend Mode设置为Alpha,不然看不到效果
在这里插入图片描述
效果
在这里插入图片描述

边缘效果

现在我们来创建一个泰森多边形,也叫沃洛诺伊图,将它和我们的透明度遮罩相乘,得到一个新的遮罩,然后再连接给最终的透明度通道
在这里插入图片描述

效果
在这里插入图片描述

动起来

然后我们让他动起来,这无疑用到了移动套装,时间节点乘以一个速度,然后进行偏移,之后连接给Angle offset,这样泰森多边形就动起来了
在这里插入图片描述
效果
在这里插入图片描述

优化

我们将最终的输出用Clamp节点限制一下范围0到1,避免不必要的显示错误
在这里插入图片描述

黑白过渡这里太明显了,我们先乘以一个较小的值处理
这里我乘以0.8然后Power指数改为5,感觉这样还不错
在这里插入图片描述
效果
在这里插入图片描述

科幻风

有趣的是,如果我们将泰森多边形的Cells作为输出,那么我们就会得到一个科幻风的效果
在这里插入图片描述
效果
在这里插入图片描述

制作一些变量

你可以根据自己的喜好调整这些参数,但为了更加方便的进行控制,下面我们将制作一些变量,跟着我做

颜色
在这里插入图片描述
接下来是指数部分,他影响遮罩的范围,所以定义一个float类型的变量,就叫range,默认值5
乘幂之前的这个相乘的数值,控制透明的力度,就叫他strength
在这里插入图片描述
泰森多边形的大小也做一个变量,就叫他Size
在这里插入图片描述
移动速度做一个变量,叫Speed
在这里插入图片描述
接下来是泰森多边形的输出,我们需要一个Branch分支节点来控制不同的输出,这样,控制Predicate是否为True,就可以控制输出了。我们也个他做成一个布尔类型的变量,就叫Cells
在这里插入图片描述

最终效果

在这里插入图片描述

最终节点图

在这里插入图片描述

代码控制

在这里插入图片描述
挂载
在这里插入图片描述

2022之前版本

正如前面所说,2022之前版本需要自己写脚本,好在github上已经有大佬帮我们写好了,我们不用关心怎么做的,只要会用就行。

下载 Blit Render Feature 脚本

github地址:https://github.com/Cyanilux/URP_BlitRenderFeature

复制Blit.cs脚本到我们本地
在这里插入图片描述
打不开或者嫌麻烦的,复制我下面的代码就行了,我已经复制过来了

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;/** Blit Renderer Feature                                                https://github.com/Cyanilux/URP_BlitRenderFeature* ------------------------------------------------------------------------------------------------------------------------* Based on the Blit from the UniversalRenderingExamples* https://github.com/Unity-Technologies/UniversalRenderingExamples/tree/master/Assets/Scripts/Runtime/RenderPasses* * Extended to allow for :* - Specific access to selecting a source and destination (via current camera's color / texture id / render texture object* - (Pre-2021.2/v12) Automatic switching to using _AfterPostProcessTexture for After Rendering event, in order to correctly handle the blit after post processing is applied* - Setting a _InverseView matrix (cameraToWorldMatrix), for shaders that might need it to handle calculations from screen space to world.* 		e.g. Reconstruct world pos from depth : https://www.cyanilux.com/tutorials/depth/#blit-perspective * - (2020.2/v10 +) Enabling generation of DepthNormals (_CameraNormalsTexture)* 		This will only include shaders who have a DepthNormals pass (mostly Lit Shaders / Graphs)(workaround for Unlit Shaders / Graphs: https://gist.github.com/Cyanilux/be5a796cf6ddb20f20a586b94be93f2b)* ------------------------------------------------------------------------------------------------------------------------* @Cyanilux
*/namespace Cyan {
/*
CreateAssetMenu here allows creating the ScriptableObject without being attached to a Renderer Asset
Can then Enqueue the pass manually via https://gist.github.com/Cyanilux/8fb3353529887e4184159841b8cad208
as a workaround for 2D Renderer not supporting features (prior to 2021.2). Uncomment if needed.
*/
//	[CreateAssetMenu(menuName = "Cyan/Blit")] public class Blit : ScriptableRendererFeature {public class BlitPass : ScriptableRenderPass {public Material blitMaterial = null;public FilterMode filterMode { get; set; }private BlitSettings settings;private RenderTargetIdentifier source { get; set; }private RenderTargetIdentifier destination { get; set; }RenderTargetHandle m_TemporaryColorTexture;RenderTargetHandle m_DestinationTexture;string m_ProfilerTag;#if !UNITY_2020_2_OR_NEWER // v8private ScriptableRenderer renderer;
#endifpublic BlitPass(RenderPassEvent renderPassEvent, BlitSettings settings, string tag) {this.renderPassEvent = renderPassEvent;this.settings = settings;blitMaterial = settings.blitMaterial;m_ProfilerTag = tag;m_TemporaryColorTexture.Init("_TemporaryColorTexture");if (settings.dstType == Target.TextureID) {m_DestinationTexture.Init(settings.dstTextureId);}}public void Setup(ScriptableRenderer renderer) {
#if UNITY_2020_2_OR_NEWER // v10+if (settings.requireDepthNormals)ConfigureInput(ScriptableRenderPassInput.Normal);
#else // v8this.renderer = renderer;
#endif}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) {CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);RenderTextureDescriptor opaqueDesc = renderingData.cameraData.cameraTargetDescriptor;opaqueDesc.depthBufferBits = 0;// Set Source / Destination
#if UNITY_2020_2_OR_NEWER // v10+var renderer = renderingData.cameraData.renderer;
#else // v8// For older versions, cameraData.renderer is internal so can't be accessed. Will pass it through from AddRenderPasses insteadvar renderer = this.renderer;
#endif// note : Seems this has to be done in here rather than in AddRenderPasses to work correctly in 2021.2+if (settings.srcType == Target.CameraColor) {source = renderer.cameraColorTarget;} else if (settings.srcType == Target.TextureID) {source = new RenderTargetIdentifier(settings.srcTextureId);} else if (settings.srcType == Target.RenderTextureObject) {source = new RenderTargetIdentifier(settings.srcTextureObject);}if (settings.dstType == Target.CameraColor) {destination = renderer.cameraColorTarget;} else if (settings.dstType == Target.TextureID) {destination = new RenderTargetIdentifier(settings.dstTextureId);} else if (settings.dstType == Target.RenderTextureObject) {destination = new RenderTargetIdentifier(settings.dstTextureObject);}if (settings.setInverseViewMatrix) {Shader.SetGlobalMatrix("_InverseView", renderingData.cameraData.camera.cameraToWorldMatrix);}if (settings.dstType == Target.TextureID) {if (settings.overrideGraphicsFormat) {opaqueDesc.graphicsFormat = settings.graphicsFormat;}cmd.GetTemporaryRT(m_DestinationTexture.id, opaqueDesc, filterMode);}//Debug.Log($"src = {source},     dst = {destination} ");// Can't read and write to same color target, use a TemporaryRTif (source == destination || (settings.srcType == settings.dstType && settings.srcType == Target.CameraColor)) {cmd.GetTemporaryRT(m_TemporaryColorTexture.id, opaqueDesc, filterMode);Blit(cmd, source, m_TemporaryColorTexture.Identifier(), blitMaterial, settings.blitMaterialPassIndex);Blit(cmd, m_TemporaryColorTexture.Identifier(), destination);} else {Blit(cmd, source, destination, blitMaterial, settings.blitMaterialPassIndex);}context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}public override void FrameCleanup(CommandBuffer cmd) {if (settings.dstType == Target.TextureID) {cmd.ReleaseTemporaryRT(m_DestinationTexture.id);}if (source == destination || (settings.srcType == settings.dstType && settings.srcType == Target.CameraColor)) {cmd.ReleaseTemporaryRT(m_TemporaryColorTexture.id);}}}[System.Serializable]public class BlitSettings {public RenderPassEvent Event = RenderPassEvent.AfterRenderingOpaques;public Material blitMaterial = null;public int blitMaterialPassIndex = 0;public bool setInverseViewMatrix = false;public bool requireDepthNormals = false;public Target srcType = Target.CameraColor;public string srcTextureId = "_CameraColorTexture";public RenderTexture srcTextureObject;public Target dstType = Target.CameraColor;public string dstTextureId = "_BlitPassTexture";public RenderTexture dstTextureObject;public bool overrideGraphicsFormat = false;public UnityEngine.Experimental.Rendering.GraphicsFormat graphicsFormat;public bool canShowInSceneView = true;}public enum Target {CameraColor,TextureID,RenderTextureObject}public BlitSettings settings = new BlitSettings();public BlitPass blitPass;public override void Create() {var passIndex = settings.blitMaterial != null ? settings.blitMaterial.passCount - 1 : 1;settings.blitMaterialPassIndex = Mathf.Clamp(settings.blitMaterialPassIndex, -1, passIndex);blitPass = new BlitPass(settings.Event, settings, name);#if !UNITY_2021_2_OR_NEWERif (settings.Event == RenderPassEvent.AfterRenderingPostProcessing) {Debug.LogWarning("Note that the \"After Rendering Post Processing\"'s Color target doesn't seem to work? (or might work, but doesn't contain the post processing) :( -- Use \"After Rendering\" instead!");}
#endifif (settings.graphicsFormat == UnityEngine.Experimental.Rendering.GraphicsFormat.None) {settings.graphicsFormat = SystemInfo.GetGraphicsFormat(UnityEngine.Experimental.Rendering.DefaultFormat.LDR);}}public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) {if (renderingData.cameraData.isPreviewCamera) return;if (!settings.canShowInSceneView && renderingData.cameraData.isSceneViewCamera) return;if (settings.blitMaterial == null) {Debug.LogWarningFormat("Missing Blit Material. {0} blit pass will not execute. Check for missing reference in the assigned renderer.", GetType().Name);return;}#if !UNITY_2021_2_OR_NEWER// AfterRenderingPostProcessing event is fixed in 2021.2+ so this workaround is no longer requiredif (settings.Event == RenderPassEvent.AfterRenderingPostProcessing) {} else if (settings.Event == RenderPassEvent.AfterRendering && renderingData.postProcessingEnabled) {// If event is AfterRendering, and src/dst is using CameraColor, switch to _AfterPostProcessTexture instead.if (settings.srcType == Target.CameraColor) {settings.srcType = Target.TextureID;settings.srcTextureId = "_AfterPostProcessTexture";}if (settings.dstType == Target.CameraColor) {settings.dstType = Target.TextureID;settings.dstTextureId = "_AfterPostProcessTexture";}} else {// If src/dst is using _AfterPostProcessTexture, switch back to CameraColorif (settings.srcType == Target.TextureID && settings.srcTextureId == "_AfterPostProcessTexture") {settings.srcType = Target.CameraColor;settings.srcTextureId = "";}if (settings.dstType == Target.TextureID && settings.dstTextureId == "_AfterPostProcessTexture") {settings.dstType = Target.CameraColor;settings.dstTextureId = "";}}
#endifblitPass.Setup(renderer);renderer.EnqueuePass(blitPass);}}
}

新增或空白阴影图Blank Shader Graph或者lit Shader Graph其实都可以
在这里插入图片描述
其实这一步跟前面类似,不过这里只是添加我们自己定义了URP配置脚本
在这里插入图片描述
配置材质
在这里插入图片描述
如果我们想要全屏效果,不希望它受处理效果的影响,您可以选择After Rendering Transparents(在渲染后处理效果后) ,但我们这里选择After Rendering Opaques (渲染不透明后),因为我希望它受到后处理效果影响
在这里插入图片描述

修改配置shader graph
在这里插入图片描述
连线参考和前面一样即可

不使用shader graph

当然如果你不想使用shader graph实现全屏效果也是可以的,可以参考我之前的文章:
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果

参考

https://www.bilibili.com/video/BV1gX4y1q72t/
https://www.youtube.com/watch?v=mCpRxFP2J1c
https://www.youtube.com/watch?v=hqz4TnvC3fQ

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

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

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

相关文章

【xilinx】如何从 Vivado GUI 启用/禁用 IP Core container

问题描述 如何从 Vivado GUI 启用/禁用 IP 核容器? 解决方案 要通过 GUI 启用/禁用 2023.1 之前的 Vivado 版本中的 IP 核容器,请按照以下步骤操作: 选择设置 -> IP -> 使用核心容器 在 Vivado 2023.1 及更高版本中,请按照…

Unity初识

1:下载Unity Hub 下载地址:Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 建议直接使用unity hub因为支持比较全面,适合新手 有中文 管理 编辑器等等功能支持 下载安装不过多介绍 2:Unity Hub汉化 因为我…

elasticsearch的使用(二)

DSL查询 Elasticsearch的查询可以分为两大类: 叶子查询(Leaf query clauses):一般是在特定的字段里查询特定值,属于简单查询,很少单独使用。 复合查询(Compound query clauses)&am…

sql注入-常见注入方法复现

环境演示均已sql-labs为例 1、报错注入 1.1常用的报错注入的函数 掌握好extractvalue、updatexml、floor报错,floor报错较难需要多理解,updatexml较为常用 定义 报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。是一种页面响应形式…

centos上传工具

yum install lrzsz 安装完成之后 作用是 输入 rz 可以本地上传文件

python自动化笔记:pytest框架

目录 一、pytest介绍二、测试用例命名规则2.1、pytest命名规则2.2、python命名规范 三、pytest运行方式3.1、主函数方式3.2、命令行方式3.3、通过pytest.ini的配置文件运行(常用) 四、跳过测试用例4.1 无条件跳过4.2 有条件跳过 五、用例的前后置&#x…

GD - GD-Link-V2接口引脚线序

文章目录 GD - GD-Link-V2接口引脚线序概述笔记接口线序连接方式 END GD - GD-Link-V2接口引脚线序 概述 弄了一个GD-Link-V2, 看了说明书,记录一下线序。 笔记 接口线序 出厂的GD-LINK-V2默认是向外供电为3.3V。 输出插座为2x5P - 2.54mm. 从GD-LINK-V2的(TOP…

数据结构——单向链表

目录 前言 一、单向链表 二、单向链表基本操作 1、链表单创建 2.节点插入 (1)尾部插入 (2)任意位置插入 3、单向链表节点删除 4、链表打印 5、释放链表 6、链表逆序 ...... 三、链表测试 总结 前言 链表(Linked List&a…

万字长文讲透数字化转型

温馨提醒:1.6w字详细拆解,内容篇幅较长,建议先收藏~ 数字化浪潮正在席卷全球,践行数字化转型和提升企业的运营水平与竞争力,已经成为各国企业角力全球市场的重要议题。为此,很多国家政府都推出了鼓励和推动…

(el-Time-Picker)操作(不使用 ts):Element-plus 中 TimePicker 组件的使用及输出想要时间格式需求的解决过程

Ⅰ、Element-plus 提供的 TimePicker 时间选择器组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供 TimePicker 组件情况&#xff1a; 其一、Element-ui 自提供的 TimePicker 代码情况为(示例的代码)&#xff1a; // Element-plus 提供的组件代码: <template>…

Go - 10. * 值类型和指针类型的差异

目录 一.引言 二.接收者类型 三.代码示例 1.指针接收者 2.值接收者 3.运行结果对比 4.代码修改 5.刨根问底 四.总结 一.引言 go 语言中 func (c *Title) 和 func (c Title) 两个方法的传参差一个 * 号&#xff0c;二者的区别是一个是指针类型&#xff0c;一个是值类型…

MATLAB中的imshow函数的使用方法及实例应用

一、imshow函数 imshow是MATLAB工具软件中用于显示图像的函数&#xff0c;它支持多种图像类型&#xff0c;包括灰度图像、真彩色图像、索引图像等。以下是对imshow常用用法: imshow(I) 在图窗中显示灰度图像 I。imshow 使用图像数据类型的默认显示范围&#xff0c;并优化图窗、…

React(三):PDF文件在线预览(简易版)

效果 依赖下载 https://mozilla.github.io/pdf.js/getting_started/ 引入依赖 源码 注意&#xff1a;pdf文件的预览地址需要配置代理后才能显示出来 import ./index.scss;function PreviewPDF() {const PDF_VIEWER_URL new URL(./libs/pdfjs-4.5.136-dist/web/viewer.html, im…

软硬链接和动静态库

为什么一定要提供路径呢&#xff1f; 因为要根据路径找到文件 一切与路径相关的问题都是方便用户去访问文件 软硬链接 给我康康 软链接是这样的&#xff1a; ln -s file_target1.txt file_soft.link 软链接有独特的innode 这是硬链接&#xff1a; ln file_target2.txt …

【Redis】缓存三大问题与缓存一致性问题

缓存三大问题 缓存穿透 缓存穿透是指用户查询的数据在缓存和数据库中都不存在&#xff0c;导致每次请求都会直接落到数据库上&#xff0c;增加数据库负载。 解决方案 1&#xff09;参数校验 一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于…

python3.10安装geopandans实战笔记

1.geopandans安装所需软件库版本 python3.10 GDAL-3.4.3-cp310-cp310-win_amd64.whl【手动下载】 Fiona-1.8.21-cp310-cp310-win_amd64.whl【手动下载】 shapely-2.0.2-cp310-cp310-win_amd64.whl【手动下载】 pyproj 手动下载地址&#xff1a;https://download.csdn.net/down…

Unity入门5——材质

创建材质 点击Assets → Create → Material&#xff0c;得到一个默认材质球的副本。 使用材质 直接把材质球拖拽到物体上&#xff0c;或设置mesh renderer组件下的Materials 数组中第一个元素

html+css网页设计公司网站模版3个页面 无js 静态页面

htmlcss网页设计公司网站模版3个页面 无js 静态页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源…

iOS弱引用

背景&#xff1a;在面试过程中被问到如果两个对象已经发生循环引用了&#xff0c;该如何将他们剪断&#xff0c;在运行态的时候。 由于这个场景比较抽象&#xff0c;我理解面试官是希望我通过运行时的方法和方式来解决循环引用。 解决方案一: 重写setter用关联对象来实现wea…

数据库规范化设计 5大基本原则

规范化设计原则是数据库设计的基本原则&#xff0c;有助于减少数据冗余&#xff0c;提高数据一致性和完整性&#xff0c;简化数据管理&#xff0c;增强数据安全性&#xff0c;对整个开发项目至关重要。而缺乏规范化设计会导致数据冗余&#xff0c;增加存储成本&#xff0c;引发…