设置一个被剔除的图层

编写一个 CustomPass

AggregateCullingParameters 中,额外包含了目标图层,以进行接下来的渲染。

Execute() 中,这个 Pass 主要做了以下事情:

  1. 对目标图层进行完整渲染。(cameraColorBuffer
  2. 对目标图层写入Motion Vector。(cameraMotionVectorsBuffer
using UnityEngine;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Rendering;
using UnityEngine.Experimental.Rendering;
using System.Collections.Generic;
using System;/// <summary>
/// DrawRenderers Custom Pass
/// </summary>
[System.Serializable]
public class ViewingObjectPass : CustomPass
{/// <summary>/// HDRP Shader passes/// </summary>public enum ShaderPass{// Ordered by frame time in HDRP///<summary>Object Depth pre-pass, only the depth of the object will be rendered.</summary>DepthPrepass = 1,///<summary>Forward pass, render the object color.</summary>Forward = 0,}// Used only for the UI to keep track of the toggle state[SerializeField] internal bool filterFoldout;[SerializeField] internal bool rendererFoldout;//Filter settings/// <summary>/// Render Queue filter to select which kind of object to render./// </summary>public RenderQueueType renderQueueType = RenderQueueType.AllOpaque;/// <summary>/// Layer Mask filter, select which layer to render./// </summary>public LayerMask layerMask = 1; // Layer mask Default enabled/// <summary>/// Sorting flags of the objects to render./// </summary>public SortingCriteria sortingCriteria = SortingCriteria.CommonOpaque;/// <summary>/// When true, overrides the depth state of the objects./// </summary>public bool overrideDepthState = false;/// <summary>/// Overrides the Depth comparison function, only used when overrideDepthState is true./// </summary>public CompareFunction depthCompareFunction = CompareFunction.LessEqual;/// <summary>/// Overrides the Depth write, only used when overrideDepthState is true./// </summary>public bool depthWrite = true;/// <summary>/// Set the shader pass to use when the override material is null/// </summary>public ShaderPass shaderPass = ShaderPass.Forward;int fadeValueId;static ShaderTagId[] forwardShaderTags;static ShaderTagId[] depthShaderTags;// Cache the shaderTagIds so we don't allocate a new array each frameShaderTagId[] cachedShaderTagIDs;[SerializeField, HideInInspector]Shader motionVectorShader;Material motionVector;/// <summary>/// Called before the first execution of the pass occurs./// Allow you to allocate custom buffers./// </summary>/// <param name="renderContext">The render context</param>/// <param name="cmd">Current command buffer of the frame</param>protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd){fadeValueId = Shader.PropertyToID("_FadeValue");// In case there was a pass index assigned, we retrieve the name of this pass//if (String.IsNullOrEmpty(overrideMaterialPassName) && overrideMaterial != null)//    overrideMaterialPassName = overrideMaterial.GetPassName(overrideMaterialPassIndex);forwardShaderTags = new ShaderTagId[]{HDShaderPassNames.s_ForwardName,            // HD Lit shaderHDShaderPassNames.s_ForwardOnlyName,        // HD Unlit shaderHDShaderPassNames.s_SRPDefaultUnlitName,    // Cross SRP Unlit shaderHDShaderPassNames.s_EmptyName,              // Add an empty slot for the override material};depthShaderTags = new ShaderTagId[]{HDShaderPassNames.s_DepthForwardOnlyName,HDShaderPassNames.s_DepthOnlyName,HDShaderPassNames.s_EmptyName,              // Add an empty slot for the override material};motionVectorShader = Shader.Find("Hidden/HDRP/MotionVectors");motionVector = CoreUtils.CreateEngineMaterial(motionVectorShader);}/// <summary>/// Use this method if you want to draw objects that are not visible in the camera./// For example if you disable a layer in the camera and add it in the culling parameters, then the culling result will contains your layer./// </summary>/// <param name="cullingParameters">Aggregate the parameters in this property (use |= for masks fields, etc.)</param>/// <param name="hdCamera">The camera where the culling is being done</param>protected override void AggregateCullingParameters(ref ScriptableCullingParameters cullingParameters, HDCamera hdCamera){cullingParameters.cullingMask |= (uint)(int)layerMask;}ShaderTagId[] GetShaderTagIds(){if (shaderPass == ShaderPass.DepthPrepass)return depthShaderTags;elsereturn forwardShaderTags;}/// <summary>/// Execute the DrawRenderers with parameters setup from the editor/// </summary>/// <param name="ctx">The context of the custom pass. Contains command buffer, render context, buffer, etc.</param>protected override void Execute(CustomPassContext ctx){var shaderPasses = GetShaderTagIds();//if (overrideMaterial != null)//{//    shaderPasses[shaderPasses.Length - 1] = new ShaderTagId(overrideMaterialPassName);//    overrideMaterial.SetFloat(fadeValueId, fadeValue);//}if (shaderPasses.Length == 0){Debug.LogWarning("Attempt to call DrawRenderers with an empty shader passes. Skipping the call to avoid errors");return;}var mask = overrideDepthState ? RenderStateMask.Depth : 0;mask |= overrideDepthState && !depthWrite ? RenderStateMask.Stencil : 0;var stateBlock = new RenderStateBlock(mask){depthState = new DepthState(depthWrite, depthCompareFunction),// We disable the stencil when the depth is overwritten but we don't write to it, to prevent writing to the stencil.stencilState = new StencilState(false),};PerObjectData renderConfig = ctx.hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask)? HDUtils.GetBakedLightingWithShadowMaskRenderConfig(): HDUtils.GetBakedLightingRenderConfig();var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(shaderPasses, ctx.cullingResults, ctx.hdCamera.camera){rendererConfiguration = renderConfig,renderQueueRange = GetRenderQueueRange(renderQueueType),sortingCriteria = sortingCriteria,excludeObjectMotionVectors = false,stateBlock = stateBlock,layerMask = layerMask,};var renderCtx = ctx.renderContext;CoreUtils.SetRenderTarget(ctx.cmd, ctx.cameraColorBuffer, ctx.cameraDepthBuffer, ClearFlag.None);CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, renderCtx.CreateRendererList(result));result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(HDShaderPassNames.s_MotionVectorsName, ctx.cullingResults, ctx.hdCamera.camera){rendererConfiguration = PerObjectData.MotionVectors,renderQueueRange = GetRenderQueueRange(renderQueueType),sortingCriteria = sortingCriteria,excludeObjectMotionVectors = false,stateBlock = stateBlock,layerMask = layerMask,};CoreUtils.SetRenderTarget(ctx.cmd, ctx.cameraMotionVectorsBuffer, ctx.cameraDepthBuffer, ClearFlag.None);CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, renderCtx.CreateRendererList(result));}protected override void Cleanup(){CoreUtils.Destroy(motionVector);}
}

把 Pass 挂起来,如图进行配置

效果

理论上不出bug的话跟正常渲染没啥区别(

可能会有奇怪的地方出BUG,比如SSAO(这个我直接禁用了),比如运动模糊和TAA(已经修复,即代码中的写入Motion Vector),欢迎留言讨论。
抛砖引玉,恳请批评指正!

参考文献:

Unity SRP 中渲染 Motion Vector 的正确姿势 - SardineFish - https://www.sardinefish.com/blog/458

HDRP(SRP) 渲染一个摄像机剔除遮罩外的物体相关推荐

  1. 如何用UE5渲染一个可爱的茶壶屋?

    Hello,今天给大家带来如何用UE5渲染一个可爱的茶壶屋? 1.介绍 今天分享一个可爱风茶壶屋制作思路.之所以选择在UE5中进行渲染,是因为他的渲染方便,后处理也可以提高初学者的使用效率. 2.参考 ...

  2. 使用OpenGL渲染一个三角形

    OplenGL的功能是什么?这里文中给出了介绍:In OpenGL everything is in 3D space, but the screen and window are a 2D arra ...

  3. 买不起手办就用AI渲染一个!用网上随便搜的图就能合成,已有网友开炒游戏NFT...

    萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 渲染一个精细到头发和皮肤褶皱的龙珠3D手办,有多复杂? 对于经典模型NeRF来说,至少需要同一个相机从特定距离拍摄的100张手办照片. 但现在,一 ...

  4. python免费网络采集_python网络数据采集7 采集一个网站所有的外链

    [python]代码库from urllib.request import urlopen from bs4 import BeautifulSoup from urllib.parse import ...

  5. 一个控制器2套模版php,如何不用一个自定义的控制器渲染一个模板

    如何不用一个自定义的控制器渲染一个模板 通常,当您需要创建一个页面,您需要创建一个控制器并且从该控制器中呈现模板.但如果您仅仅呈现一个简单的模板,并且不需要传递给它的任何数据,则完全没必要创建一个控制 ...

  6. 图观——渲染一个简易的三维场景

    哈喽,今天回归更新啦?各位铁铁又遇到的问题也可以私信或留言一起讨论. 今天要跟小伙伴们分享的是怎么去渲染一个三维场景(这里用到的是图观引擎),首先渲染之前我们要制作三维场景.制作三维场景可以使用三维场 ...

  7. 监控摄像头1天存储计算机,如何计算一个摄像机一天占用多少的存储量?

    原标题:如何计算一个摄像机一天占用多少的存储量? 如何计算硬盘能存多长时间的监控视频,如何计算一个摄像机一天占用多少的存储量?现总结网上资料,做出以下言简意赅的总结: 1.IPC码流 摄像机的码流即监 ...

  8. echarts渲染一个风向图

    今天给大家说一个用echarts渲染一个风向图,这里图上其实有三个要素,风向,风级和能见度,主要还是讲讲代码里面的坑 1.风向图标方向修改以及设置 var ownData = echarts.util ...

  9. 一个简单的题外话:周五,我们的心情

    *一个简单的题外话:周五 盼望着每个周五,因为它重拾而又蓄力待发! (看代码之余看看大家的小心思,欢迎评论你们的周五期待的是什么:?) 也是这对于我们这里90后95后的程序猿吧: 也是我在公司几个月的 ...

最新文章

  1. 牛!月入2w,95后送外卖的程序员,送餐途中改bug
  2. python 作用with_即使__init__方法有效,Python中的With语句仍返...
  3. 北京内推 | 美团用户平台NLP中心招聘图学习(GNN)方向实习生
  4. ns2相关学习——TCL脚本编写(3)
  5. xlsxwriter写行合并_使用实现XlsxWriter创建Excel文件并编辑
  6. nginx 监听同一端口
  7. Qt4_写TCP客户/服务器应用程序
  8. zabbix报错cannot set resource limit: [13] Permission denied解决方法
  9. 乐视android系统耗电量大,乐视手机突然充电慢耗电快,怎么解决?
  10. 孙鑫VC学习笔记:第三讲 MFC应用程序框架
  11. 09-网格划分质量查看
  12. 英国交通分析指南(Transport analysis guidance)解读及启示
  13. 中国五笔 恶意软件清理助手
  14. MyBatis入门系列(9) -MyBatis之SQL语句构建器
  15. python 3维正态分布图_三维正态分布图
  16. linux 系统启动服务setup设置
  17. 原生JavaScript实现连连看游戏
  18. IPC编程C语言,4. UNIX Domain Socket IPC
  19. 5000英镑就可买到控制美国核武库的同款IBM电脑
  20. 华为郑叶来:AI炒作和投机回落,是行业应用春天的开始

热门文章

  1. 基于springboot,vue电影院售票系统
  2. 详解专利对学生、老师和企业员工、创业者、积分落户、地方补助的好处
  3. 数字图像处理期末大作业-美图秀秀
  4. 代码行数统计工具statistic和cloc的使用
  5. 2022相亲交友婚恋源码支持公众号APP小程序
  6. 安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上)
  7. c++ 实现键盘钩子
  8. View For EasyUI 后台模板html
  9. 经典回顾:用pygame模块做一个飞机大战
  10. 携载PEG-PLA纳米粒子/F3O4磁性纳米粒子/银纳米团簇基/纳米二氧化钛改性壳聚糖水凝胶