网站变慢的原因,青海省建设局网站,郴州seo外包,网站开发图片编辑最终效果 文章目录 最终效果前言unity2022版本 Fullscreen shader graph首先#xff0c;请注意你的Inity版本#xff0c;是不是2022.2以上#xff0c;并且项目是URP项且基本配置 修改shader graph边缘效果动起来优化科幻风制作一些变量最终效果最终节点图代码控制 2022之前版…最终效果 文章目录 最终效果前言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 cameras 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 // v10if (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 // v10var renderer renderingData.cameraData.renderer;
#else // v8// For older versions, cameraData.renderer is internal so cant 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.2if (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} );// Cant 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 doesnt seem to work? (or might work, but doesnt 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?vmCpRxFP2J1c https://www.youtube.com/watch?vhqz4TnvC3fQ
完结
赠人玫瑰手有余香如果文章内容对你有所帮助请不要吝啬你的点赞评论和关注你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法也欢迎评论私信告诉我哦
好了我是向宇https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者闲暇之余边学习边记录分享站在巨人的肩膀上通过学习前辈们的经验总是会给我很多帮助和启发如果你遇到任何问题也欢迎你评论私信找我 虽然有些问题我也不一定会但是我会查阅各方资料争取给出最好的建议希望可以帮助更多想学编程的人共勉~