【URP】Unity 插入自定義RenderPass

【從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…