【从UnityURP开始探索游戏渲染】专栏-直达

自定义渲染通道是一种改变通用渲染管道(URP)如何渲染场景或场景中的对象的方法。自定义呈现通道(RenderPass)包含自己的Render代码,可以在注入点将其添加到RenderPass中。

添加自定义呈现通道(RenderPass):

  • 使用Scriptable render pass API创建自定义render pass的代码。
  • 将自定的render pass注入到URP管线中的指定注入点中,有两种方式:
    • RenderPipelineManager API注入自定义渲染通道
    • 或者通过创建一个可脚本化的RendererFeature添加到URP渲染器中。

使用Scriptable render pass API创建自定义render pass

  • Example custom render pass

    using UnityEngine;
    using UnityEngine.Rendering;
    using UnityEngine.Rendering.Universal;internal class ColorBlitPass : ScriptableRenderPass
    {ProfilingSampler m_ProfilingSampler = new ProfilingSampler("ColorBlit");Material m_Material;RTHandle m_CameraColorTarget;float m_Intensity;public ColorBlitPass(Material material){m_Material = material;renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing;}public void SetTarget(RTHandle colorHandle, float intensity){m_CameraColorTarget = colorHandle;m_Intensity = intensity;}public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData){ConfigureTarget(m_CameraColorTarget);}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){var cameraData = renderingData.cameraData;if (cameraData.camera.cameraType != CameraType.Game)return;if (m_Material == null)return;CommandBuffer cmd = CommandBufferPool.Get();using (new ProfilingScope(cmd, m_ProfilingSampler)){m_Material.SetFloat("_Intensity", m_Intensity);Blitter.BlitCameraTexture(cmd, m_CameraColorTarget, m_CameraColorTarget, m_Material, 0);}context.ExecuteCommandBuffer(cmd);cmd.Clear();CommandBufferPool.Release(cmd);}
    }

将自定的render pass注入到URP管线中的指定注入点中

RenderPipelineManager API注入自定义渲染通道

  • 通过RenderPipelineManager的注入点委托提供执行时机,加上Camera的EnqueuePass方法注入自定义RenderPass。

    public class EnqueuePass : MonoBehaviour
    {[SerializeField] private BlurSettings settings;    private BlurRenderPass blurRenderPass;private void OnEnable(){...blurRenderPass = new BlurRenderPass(settings);// Subscribe the OnBeginCamera method to the beginCameraRendering event.RenderPipelineManager.beginCameraRendering += OnBeginCamera;}private void OnDisable(){RenderPipelineManager.beginCameraRendering -= OnBeginCamera;blurRenderPass.Dispose();...}private void OnBeginCamera(ScriptableRenderContext context, Camera cam){...// Use the EnqueuePass method to inject a custom render passcam.GetUniversalAdditionalCameraData().scriptableRenderer.EnqueuePass(blurRenderPass);}
    }

创建一个可脚本化的RendererFeature

此示例执行将屏幕染成绿色的全屏blit。

  • 要创建自定义渲染通道,创建一个名为ColorBlitPass.cs的新c#脚本,然后从示例自定义渲染通道部分粘贴代码。

    • 注意:这个例子使用了Blitter API。不要使用CommandBuffer。URP中的Blit API。更多信息请参考Blit。
    • 使用上面定义好的定制Render Pass
  • 要创建Scriptable RendererFeature,将自定义渲染通道添加到渲染循环中,请创建一个名为ColorBlitRendererFeature.cs的新c#脚本,然后将示例Scriptable RendererFeature部分中的代码粘贴进来。

    • Example Scriptable Renderer Feature Scriptable Renderer Feature 添加 render pass 到渲染循环.

      using UnityEngine;
      using UnityEngine.Rendering;
      using UnityEngine.Rendering.Universal;internal class ColorBlitRendererFeature : ScriptableRendererFeature
      {public Shader m_Shader;public float m_Intensity;Material m_Material;ColorBlitPass m_RenderPass = null;public override void AddRenderPasses(ScriptableRenderer renderer,ref RenderingData renderingData){if (renderingData.cameraData.cameraType == CameraType.Game)renderer.EnqueuePass(m_RenderPass);}public override void SetupRenderPasses(ScriptableRenderer renderer,in RenderingData renderingData){if (renderingData.cameraData.cameraType == CameraType.Game){// Calling ConfigureInput with the ScriptableRenderPassInput.Color argument// ensures that the opaque texture is available to the Render Pass.m_RenderPass.ConfigureInput(ScriptableRenderPassInput.Color);m_RenderPass.SetTarget(renderer.cameraColorTargetHandle, m_Intensity);}}public override void Create(){m_Material = CoreUtils.CreateEngineMaterial(m_Shader);m_RenderPass = new ColorBlitPass(m_Material);}protected override void Dispose(bool disposing){CoreUtils.Destroy(m_Material);}
      }
  • 要创建将像素染成绿色的着色器代码,请创建一个着色器文件,然后从示例着色器部分粘贴代码。

  • Example shader

    • 着色器执行渲染的GPU端。它从相机中采样颜色纹理,然后输出绿色值设置为所选强度的颜色。
      注意:与Blitter API一起使用的着色器必须是手工编码的着色器。图形着色器与Blitter API不兼容。

      Shader "ColorBlit"
      {SubShader{Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline"}LOD 100ZWrite Off Cull OffPass{Name "ColorBlitPass"HLSLPROGRAM#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"// The Blit.hlsl file provides the vertex shader (Vert),// the input structure (Attributes) and the output structure (Varyings)#include "Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl"#pragma vertex Vert#pragma fragment frag// Set the color texture from the camera as the input textureTEXTURE2D_X(_CameraOpaqueTexture);SAMPLER(sampler_CameraOpaqueTexture);// Set up an intensity parameterfloat _Intensity;half4 frag (Varyings input) : SV_Target{UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);// Sample the color from the input texturefloat4 color = SAMPLE_TEXTURE2D_X(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, input.texcoord);// Output the color from the texture, with the green value set to the chosen intensityreturn color * float4(0, _Intensity, 0, 1);}ENDHLSL}}
      }
      
  • 将ColorBlitRendererFeature添加到当前URP Renderer资源中。有关更多信息,请参阅向URP渲染器添加渲染器功能。

  • 要更改亮度,请调整Color Blit Renderer Feature组件中的Intensity属性。

注意:如果项目使用XR,为了使示例可视化,在项目中安装MockHMD XR插件包,然后将渲染模式属性设置为单通道实例化。


https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@14.0/manual/renderer-features/custom-rendering-pass-workflow-in-urp.html


【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

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

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

相关文章

DevSecOps 集成 CI/CD Pipeline:实用指南

就在你以为软件开发已无简化的余地时,新的解决方案应运而生 随着软件开发几乎每天都在攀升,组织不断尝试以前所未有的速度交付新功能和应用程序。虽然持续集成和持续交付 (CI/CD) Pipeline 彻底改变了软件部署,但它们…

vue2+elementui 表格单元格增加背景色,根据每列数据的大小 颜色依次变浅显示

注释: vue2elementui 表格列实现一个功能,给定两个颜色:红色 #f96d6f 和 绿色 #63be7b,列数据正数时表格单元格背景色为红色,列数据负数时表格单元格背景色为绿色,根据数据的大小颜色依次越来越淡&#xff…

【JavaEE】(19) MyBatis-plus

一、MyBatis Generator 为 MyBastis 框架设计的代码生成工具,简化持久层编码工作。根据数据库表自动生成 Java 实体类、Mapper 接口、SQL 的 xml 文件。让开发者专注于业务逻辑。 1、引入插件 MyBatis 官网搜索 MyBatis Generator 插件:Running MyBatis…

Android之腾讯TBS文件预览

文章目录前言一、效果图二、实现步骤1.去官网注册并创建应用[腾讯官网](https://console.cloud.tencent.com/tbs/client)2.下载arr文件并引入[腾讯TBS](https://download.csdn.net/download/Android_Cll/91764395)3.application实例化4.activity实例化5.下载网络文件6.PreviewA…

基于微信小程序的化妆品成分查询系统源码

源码题目:基于微信小程序的化妆品成分查询系统源码☑️ 文末联系获取(含源码、技术文档)博主简介:10年高级软件工程师、JAVA技术指导员、Python讲师、文章撰写修改专家、Springboot高级,欢迎高校老师、同行交流合作。毕…

STM32 启动执行逻辑与代码烧入方法详解:从底层原理到实操落地

STM32 启动执行逻辑与代码烧入方法详解:从底层原理到实操落地背景概要STM32启动和执行的核心逻辑链条代码烧入到STM32的途径方法结束语背景概要 在学习STM32时候我们知道代码需要通过一些下载器(如ST-Link、J-Link)或者串口下载烧入到STM32芯…

Go对接印度股票数据源指南:使用StockTV API

一、StockTV API简介 StockTV提供全球200国家的实时金融数据,覆盖股票、外汇、期货和加密货币市场。针对印度市场(国家ID14),其主要优势包括: 毫秒级低延迟响应7x24小时稳定服务日均处理亿级数据免费技术支持 官方资源…

ESP8266:Arduino学习

ESP8266一:环境搭建使用Ardino框架,在官网下载,下载离线的支持包二:实现简单的项目1. 点灯{pinMode(LED_PIN, OUTPUT); // 设置引脚为输出模式digitalWrite(LED_PIN, HIGH); // 点亮 LED}I/O引脚的三种模式分别为:INPU…

青少年软件编程(python六级)等级考试试卷-客观题(2023年3月)

更多内容和历年真题请查看网站:【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 六级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年软件编程(python六级)等级考试试卷-客观题(2023年3月&#xff09…

mongodb influxdb

、您需要提前配置 MongoDB 和 InfluxDB。让我帮您说明配置步骤: MongoDB 配置 启动 MongoDB 容器后,进入容器创建数据库: # 进入 MongoDB 容器 docker exec -it mongo mongosh -u root -p 123456# 创建 product 数据库 use product# 创建集合…

模拟电路中什么时候适合使用电流传递信号,什么时候合适使用电压传递信号

一、应用 1.实际应用中,需要进行权衡,比如抗干扰能力,传输距离,功耗 2.电压信号比较容易受到干扰,对噪声比较敏感,有噪声容限一说 3.电流信号对噪声不敏感 4.电源电压下降的稳定性或者长距离传输中的损耗问…

Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化

stevensu1/EC0823: Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化 在 Flink 流处理应用中使用 HikariCP 实现数据库连接池化,对于写入关系型数据库(如 MySQL、PostgreSQL)的 自定义 Sink 来说,不仅是推…

Ubuntu安装及配置Git(Ubuntu install and config Git Tools)

Setup Git sudo apt update sudo apt install git // 查看git版本 git --versionConfig Github // 不清楚username和email的可以直接在github网站上点击头像选择settings来查看 git config --global user

将C++资源管理测试框架整合到GitLab CI/CD的完整实践指南

将C资源管理测试框架整合到GitLab CI/CD的完整实践指南 摘要 本文深入探讨了如何将先进的C资源管理测试框架无缝集成到GitLab CI/CD流水线中,实现自动化资源监控、性能回归检测和高质量测试。通过实际案例和最佳实践,展示了如何构建一个能够精确控制CPU亲…

Web漏洞

一、Sql注入 sql注入漏洞的成因是由于后端数据库查询语句没有做过滤导致了前端输入字符串可以直接拼接到语句而获取数据库信息。 1.类型 数字型和字符型 区分:数字型可以进行加减运算,id11会获取id2的信息,而字符型只会获取1的数据 2.方…

Java中使用Spring Boot+Ollama构建本地对话机器人

目录结构Ollama是什么安装 Ollama下载大模型运行模型Java和IDEA版本创建一个springboot项目创建一个简单的对话接口启动spring boot流式对话输出用原生 HTML 打造可交互前端接入 OpenAI、DeepSeek 等云模型(可选)原文地址传送门 我是想做一个大模型本地部…

学习设计模式《二十四》——访问者模式

一、基础概念 访问者模式的本质是【预留后路,回调实现】。仔细思考访问者模式,它的实现主要是通过预先定义好调用的通路,在被访问的对象上定义accept方法,在访问者的对象上定义visit方法;然后在调用真正发生的时候&…

Rust 符号体系全解析:分类、应用与设计意图

Rust 的符号体系是其语法规则、内存安全与类型安全设计的核心载体。每个符号不仅承担特定功能,更隐含 Rust 对 “安全” 与 “表达力” 的平衡逻辑。本文按功能维度,系统梳理 Rust 中所有常用符号,结合代码示例与设计背景,提供全面…

神经网络|(十六)概率论基础知识-伽马函数·上

【1】引言 前序学习进程中,对经典的二项分布和正态分布已经有一定的掌握。 今天为学习一种稍显复杂的分布提前布局一下,学习伽马函数。 【2】伽马函数 伽马函数有两种经典写法,一种是积分形式,另一种是无穷乘积形式。 【2.1】…

安全向量模板类SiVector

实现一个安全向量模板类 SiVector,其设计目标是:在保持 std::vector 易用性的基础上,增强越界访问的安全性(避免崩溃),同时兼容 std::vector 的核心接口和使用习惯。支持嵌套使用(如 SiVector&l…