成都网站建设 3e网站建设,万网域名管理平台,绿色建筑网站,安年软文网描边需要深度法线纹理的加持#xff0c;效果才能达到最好#xff0c;但URP下很多版本不支持直接获取_CameraNormalsTexture#xff0c;而我本人也尝试了一下在12.1.7下偷懒直接拿SSAO里的Depth Normal图#xff0c; 虽然也能实现吧#xff0c;但是需要打开SSAO的同时…描边需要深度法线纹理的加持效果才能达到最好但URP下很多版本不支持直接获取_CameraNormalsTexture而我本人也尝试了一下在12.1.7下偷懒直接拿SSAO里的Depth Normal图 虽然也能实现吧但是需要打开SSAO的同时再在shader中加入指定的Tag为DepthNormals的Pass才能实现 稍微有点麻烦而且总有种用别人东西的感觉。
那就尝试一下自己动手吧动手造一个获取深度法线纹理的轮子
贴一下项目环境
URP12.1.7
Unity2021.3.8f1 浅看两篇手动获取深度法线纹理的文章URP深度法线纹理 - 简书 (jianshu.com)和雪风大佬的urp管线的自学hlsl之路 第二十四篇 科幻扫描效果后篇 - 哔哩哔哩 (bilibili.com)实现都是依靠build-in底下的shader然后将绘制出来的纹理传递给URP下自己项目定义的shader使用。
1 定义RenderFeature获取法线深度图
这个是参考了上述的过程说实话内容太过复杂。只有不断多学习多做每次都好好做备注总有一天会完全理解的
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;public class DepthNormalsFeature : ScriptableRendererFeature
{// 定义3个共有变量public class Settings{//public Shader shader; // 设置后处理shaderpublic Material material; //后处理Materialpublic RenderPassEvent renderPassEvent RenderPassEvent.BeforeRenderingPostProcessing; // 定义事件位置放在了官方的后处理之前}// 初始化一个刚刚定义的Settings类public Settings settings new Settings();// 初始化PassDepthNormalsPass depthNormalsPass;// 初始化纹理RenderTargetHandle depthNormalsTexture;// 材质Material depthNormalsMaterial;// 给pass传递变量并加入渲染管线中public override void Create(){// 通过Built-it管线中的Shader创建材质最重要的一步depthNormalsMaterial CoreUtils.CreateEngineMaterial(Hidden/Internal-DepthNormalsTexture);// 获取Pass渲染队列渲染对象材质depthNormalsPass new DepthNormalsPass(RenderQueueRange.opaque, -1, depthNormalsMaterial);// 设置渲染时机 预渲染通道后depthNormalsPass.renderPassEvent RenderPassEvent.AfterRenderingPrePasses;// 设置纹理名depthNormalsTexture.Init(_CameraDepthNormalsTexture);}//这里你可以在渲染器中注入一个或多个渲染通道。//这个方法在设置渲染器时被调用。public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData){// 对Pass进行参数设置当前渲染相机信息深度法线纹理depthNormalsPass.Setup(renderingData.cameraData.cameraTargetDescriptor, depthNormalsTexture);// 写入渲染管线队列renderer.EnqueuePass(depthNormalsPass);}}public class DepthNormalsPass : ScriptableRenderPass
{int kDepthBufferBits 32; // 缓冲区大小private RenderTargetHandle Destination { get; set; } // 深度法线纹理private Material DepthNormalsMaterial null; // 材质private FilteringSettings m_FilteringSettings; // 筛选设置static readonly string m_ProfilerTag Depth Normals Pre Pass; // 定义渲染TagShaderTagId m_ShaderTagId new ShaderTagId(MyDepthOnly); // 绘制标签Shader需要声明这个标签的tag/// summary/// 构造函数Pass/// /summary/// param namerenderQueueRange/param/// param namelayerMask/param/// param namematerial/parampublic DepthNormalsPass(RenderQueueRange renderQueueRange, LayerMask layerMask, Material material){m_FilteringSettings new FilteringSettings(renderQueueRange, layerMask);DepthNormalsMaterial material;}/// summary/// 参数设置/// /summary/// param namebaseDescriptor/param/// param nameDestination/parampublic void Setup(RenderTextureDescriptor baseDescriptor, RenderTargetHandle Destination){// 设置纹理this.Destination Destination;}/// summary/// 配置渲染目标可创建临时纹理/// /summary/// param namecmd/param/// param namecameraTextureDescriptor/parampublic override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor){// 设置渲染目标信息RenderTextureDescriptor descriptor cameraTextureDescriptor;descriptor.depthBufferBits kDepthBufferBits;descriptor.colorFormat RenderTextureFormat.ARGB32;// 创建一个临时的RT储存深度法线纹理、目标信息和滤波模式cmd.GetTemporaryRT(Destination.id, descriptor, FilterMode.Point);// 配置ConfigureTarget(Destination.Identifier());// 清楚未渲染时配置为黑色ConfigureClear(ClearFlag.All, Color.black);}// /// summary/// 后处理逻辑和渲染核心函数相当于build-in 的OnRenderImage()/// 实现渲染逻辑/// /summary/// param namecontext/param/// param namerenderingData/parampublic override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){var cmd CommandBufferPool.Get(m_ProfilerTag); // 设置渲染标签using (new ProfilingSample(cmd, m_ProfilerTag)){// 执行命令缓存context.ExecuteCommandBuffer(cmd);// 清楚数据缓存cmd.Clear();// 相机的排序标志var sortFlags renderingData.cameraData.defaultOpaqueSortFlags;// 创建绘制设置var drawSettings CreateDrawingSettings(m_ShaderTagId, ref renderingData, sortFlags);// 设置对象数据drawSettings.perObjectData PerObjectData.None;// 设置覆盖材质drawSettings.overrideMaterial DepthNormalsMaterial;// 绘制渲染器context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref m_FilteringSettings);// 设置全局纹理cmd.SetGlobalTexture(_CameraDepthNormalsTexture, Destination.id);}// 执行命令缓冲区context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}// 清除此呈现传递执行期间创建的任何已分配资源。public override void FrameCleanup(CommandBuffer cmd){if (Destination ! RenderTargetHandle.CameraTarget){cmd.ReleaseTemporaryRT(Destination.id);Destination RenderTargetHandle.CameraTarget;}}
}
2 在Shader中使用
上述RenderFeature我们获得了一个全局的_CameraDepthNormalsTexture变量我们就可以像Build-in下一样访问啦
但是一些之前固定管线下的一些采样、解码Texture函数在URP下不能直接用要自己定义主要需要一个解码函数。固定管线下函数 其中 直接搬运完全没问题~
我给他合起来了合成了一个函数返回的时候用就行 还要注意采样要是屏幕空间的UV不然乱七八糟。
然后shader后面必须也要加上一个自定义的LightTag 突然发现这个复杂程度跟SSAO那个差不多。。。
看看效果我们单独输出深度和法线 一切正常终于可以进行下一步了。
参考
URP深度法线纹理 - 简书 (jianshu.com) 文章转载自: http://www.morning.ysqb.cn.gov.cn.ysqb.cn http://www.morning.nzmqn.cn.gov.cn.nzmqn.cn http://www.morning.kjlhb.cn.gov.cn.kjlhb.cn http://www.morning.kdgcx.cn.gov.cn.kdgcx.cn http://www.morning.nswcw.cn.gov.cn.nswcw.cn http://www.morning.wgdnd.cn.gov.cn.wgdnd.cn http://www.morning.znqztgc.cn.gov.cn.znqztgc.cn http://www.morning.ljjmr.cn.gov.cn.ljjmr.cn http://www.morning.wyfpc.cn.gov.cn.wyfpc.cn http://www.morning.brfxt.cn.gov.cn.brfxt.cn http://www.morning.pbpcj.cn.gov.cn.pbpcj.cn http://www.morning.wcgcm.cn.gov.cn.wcgcm.cn http://www.morning.xnpml.cn.gov.cn.xnpml.cn http://www.morning.phnbd.cn.gov.cn.phnbd.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.wqbbc.cn.gov.cn.wqbbc.cn http://www.morning.vaqmq.cn.gov.cn.vaqmq.cn http://www.morning.khlxd.cn.gov.cn.khlxd.cn http://www.morning.tktcr.cn.gov.cn.tktcr.cn http://www.morning.qdrrh.cn.gov.cn.qdrrh.cn http://www.morning.ljfjm.cn.gov.cn.ljfjm.cn http://www.morning.fkmrj.cn.gov.cn.fkmrj.cn http://www.morning.qtyfb.cn.gov.cn.qtyfb.cn http://www.morning.rwjh.cn.gov.cn.rwjh.cn http://www.morning.srkzd.cn.gov.cn.srkzd.cn http://www.morning.mnrqq.cn.gov.cn.mnrqq.cn http://www.morning.wpcfh.cn.gov.cn.wpcfh.cn http://www.morning.krrjb.cn.gov.cn.krrjb.cn http://www.morning.jfsbs.cn.gov.cn.jfsbs.cn http://www.morning.fqmcc.cn.gov.cn.fqmcc.cn http://www.morning.lnbyk.cn.gov.cn.lnbyk.cn http://www.morning.nqbkb.cn.gov.cn.nqbkb.cn http://www.morning.zpnfc.cn.gov.cn.zpnfc.cn http://www.morning.nydgg.cn.gov.cn.nydgg.cn http://www.morning.xqgtd.cn.gov.cn.xqgtd.cn http://www.morning.errnull.com.gov.cn.errnull.com http://www.morning.htrzp.cn.gov.cn.htrzp.cn http://www.morning.glncb.cn.gov.cn.glncb.cn http://www.morning.fcftj.cn.gov.cn.fcftj.cn http://www.morning.rnkq.cn.gov.cn.rnkq.cn http://www.morning.rkwlg.cn.gov.cn.rkwlg.cn http://www.morning.npfkw.cn.gov.cn.npfkw.cn http://www.morning.junmap.com.gov.cn.junmap.com http://www.morning.flfdm.cn.gov.cn.flfdm.cn http://www.morning.xltdh.cn.gov.cn.xltdh.cn http://www.morning.ffbl.cn.gov.cn.ffbl.cn http://www.morning.ltbwq.cn.gov.cn.ltbwq.cn http://www.morning.wxccm.cn.gov.cn.wxccm.cn http://www.morning.hsflq.cn.gov.cn.hsflq.cn http://www.morning.kcyxs.cn.gov.cn.kcyxs.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.sbpt.cn.gov.cn.sbpt.cn http://www.morning.hgkbj.cn.gov.cn.hgkbj.cn http://www.morning.pwhjr.cn.gov.cn.pwhjr.cn http://www.morning.nbdtdjk.cn.gov.cn.nbdtdjk.cn http://www.morning.trhrk.cn.gov.cn.trhrk.cn http://www.morning.qpqwb.cn.gov.cn.qpqwb.cn http://www.morning.nrgdc.cn.gov.cn.nrgdc.cn http://www.morning.nuejun.com.gov.cn.nuejun.com http://www.morning.wpydf.cn.gov.cn.wpydf.cn http://www.morning.rrpsw.cn.gov.cn.rrpsw.cn http://www.morning.kqgqy.cn.gov.cn.kqgqy.cn http://www.morning.jcxzq.cn.gov.cn.jcxzq.cn http://www.morning.hymmq.cn.gov.cn.hymmq.cn http://www.morning.kpbq.cn.gov.cn.kpbq.cn http://www.morning.lmmkf.cn.gov.cn.lmmkf.cn http://www.morning.dkslm.cn.gov.cn.dkslm.cn http://www.morning.llllcc.com.gov.cn.llllcc.com http://www.morning.ityi666.cn.gov.cn.ityi666.cn http://www.morning.whothehellami.com.gov.cn.whothehellami.com http://www.morning.rdkgw.cn.gov.cn.rdkgw.cn http://www.morning.ntzbr.cn.gov.cn.ntzbr.cn http://www.morning.xysxj.com.gov.cn.xysxj.com http://www.morning.ztdlp.cn.gov.cn.ztdlp.cn http://www.morning.lnrhk.cn.gov.cn.lnrhk.cn http://www.morning.htrzp.cn.gov.cn.htrzp.cn http://www.morning.qkrgk.cn.gov.cn.qkrgk.cn http://www.morning.sdktr.com.gov.cn.sdktr.com http://www.morning.rqqkc.cn.gov.cn.rqqkc.cn http://www.morning.sgpny.cn.gov.cn.sgpny.cn