URP 2022.3 custom render pass

news2024/11/15 11:49:03

这里需要注意,有两个部分要做,一步是写脚本和shader,一步是在editor里进行绑定
这里有个概念上需要注意的,他这个pass啊,实际依赖问题都需要你自己在execute处理的,比如你要画N次东西,就要在execute里自己把逻辑梳理清楚,调用Blit进行绘制,然后读取,然后绘制,下面代码会有体现
这是 官方用法
先说第二步,我感觉第二步更加关键,我这里虽然名字是Blur,但是效果不是,我进行了化简,名字是因为我直接从上面的链接copy的代码
在这里插入图片描述
最下面这个add renderer feature按钮,当你完整的写完一个render feature组件后,这里是能识别到的,你点击他 下拉列表就有你刚写好的feature,所以关键就是找到你正在使用的renderer,添加你写好的render feature即可

下面说代码怎么写的
流程上,这里已知需要一个render feature,然后他会将PASS添加到渲染流程的执行时间点上
所以,我们需要的物件就是
在这里插入图片描述

这个feature的代码可以说是很简单
create就创建pass,指定inject point
dispose就是清理数据
add就是把pass对象加入渲染流程,render就不用你管了,会在对应的时间点执行pass的execute的

using System;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering.Universal;

public class BlurRendererFeature : ScriptableRendererFeature
{
    [SerializeField] private Shader shader;
    private Material material;
    private BlurRenderPass blurRenderPass;

    public override void Create()
    {
        if (shader == null)
        {
            return;
        }
        material = new Material(shader);
        blurRenderPass = new BlurRenderPass(material);

        blurRenderPass.renderPassEvent = RenderPassEvent.AfterRenderingSkybox;
    }

    public override void AddRenderPasses(ScriptableRenderer renderer,
        ref RenderingData renderingData)
    {
        if (renderingData.cameraData.cameraType == CameraType.Game)
        {
            renderer.EnqueuePass(blurRenderPass);
        }
    }

    protected override void Dispose(bool disposing)
    {
        blurRenderPass.Dispose();
#if UNITY_EDITOR
        if (EditorApplication.isPlaying)
        {
            Destroy(material);
        }
        else
        {
            DestroyImmediate(material);
        }
#else
                Destroy(material);
#endif
    }
}

下面就是pass了,
需要的成员变量,材质,渲染纹理描述,渲染对象的句柄(这里应该就是对应OpenGL的FBO的ID
唯一一个关联就是这个函数 RenderingUtils.ReAllocateIfNeeded,应该就是函数内部逻辑判断如果需要的话,就创建一个texture然后返回ID
构造函数就给材质赋值,初始化一个FBO纹理的描述
这个configure函数类似窗口resize啥的需要重绘反正就要重新设置一下size类似这种
然后就是Blit函数,前面几个好理解,最后一个参数是你的material的shader里的pass的index

using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class BlurRenderPass : ScriptableRenderPass
{
   
    private Material material;

    private RenderTextureDescriptor blurTextureDescriptor;
    private RTHandle blurTextureHandle;

    public BlurRenderPass(Material material)
    {
        this.material = material;

        blurTextureDescriptor = new RenderTextureDescriptor(Screen.width,
            Screen.height, RenderTextureFormat.Default, 0);
    }

    public override void Configure(CommandBuffer cmd,
        RenderTextureDescriptor cameraTextureDescriptor)
    {
        // Set the blur texture size to be the same as the camera target size.
        blurTextureDescriptor.width = cameraTextureDescriptor.width;
        blurTextureDescriptor.height = cameraTextureDescriptor.height;

        // Check if the descriptor has changed, and reallocate the RTHandle if necessary
        RenderingUtils.ReAllocateIfNeeded(ref blurTextureHandle, blurTextureDescriptor);
    }



    public override void Execute(ScriptableRenderContext context,
        ref RenderingData renderingData)
    {
        //Get a CommandBuffer from pool.
        CommandBuffer cmd = CommandBufferPool.Get();

        RTHandle cameraTargetHandle =
            renderingData.cameraData.renderer.cameraColorTargetHandle;

        

        // Blit from the camera target to the temporary render texture,
        // using the first shader pass.
        Blit(cmd, cameraTargetHandle, blurTextureHandle, material, 0);
        // Blit from the temporary render texture to the camera target,
        // using the second shader pass.
        Blit(cmd, blurTextureHandle, cameraTargetHandle, material, 1);

        //Execute the command buffer and release it back to the pool.
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
    }

    public void Dispose()
    {
#if UNITY_EDITOR
        if (EditorApplication.isPlaying)
        {
            Object.Destroy(material);
        }
        else
        {
            Object.DestroyImmediate(material);
        }
#else
                Object.Destroy(material);
#endif

        if (blurTextureHandle != null) blurTextureHandle.Release();
    }
}

这是HLSL风格,#pragma指定函数入口,提示说vert函数在blit.hlsl里,不需要写
这里就有俩PASS,Blit的最后一个函数就是指定此次渲染你要使用第几个,我这里第一次叠加蓝色,第二次叠加红色,最终画面呈现紫色

Shader "CustomRenderTexture/Blur"
{
    HLSLINCLUDE
    
        #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"

        
    
        float4 BlurVertical (Varyings input) : SV_Target
        {
            return SAMPLE_TEXTURE2D(_BlitTexture, sampler_LinearClamp, input.texcoord) + float4(0.0, 0.0, 1.0, 0.2);
        }

        float4 BlurHorizontal (Varyings input) : SV_Target
        {
            return SAMPLE_TEXTURE2D(_BlitTexture, sampler_LinearClamp, input.texcoord) + float4(1.0, 0.0, 0.0, 0.2);
        }
    
    ENDHLSL
    
    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline"}
        LOD 100
        ZWrite Off Cull Off
        Pass
        {
            Name "BlurPassVertical"

            HLSLPROGRAM
            
            #pragma vertex Vert
            #pragma fragment BlurVertical
            
            ENDHLSL
        }
        
        Pass
        {
            Name "BlurPassHorizontal"

            HLSLPROGRAM
            
            #pragma vertex Vert
            #pragma fragment BlurHorizontal
            
            ENDHLSL
        }
    }
}

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管易云·奇门与MySQL对接集成历史发货单查询连通执行操作-v1(管易历史发货单)

管易云奇门与MySQL对接集成历史发货单查询连通执行操作-v1(管易历史发货单) 接通系统:管易云奇门 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌,先后开发了C-ERP、EC-OMS、EC-WMS、E店管家、BBC、B2B、B2C商城网站建设等产品和服务&#xff0c…

算法力扣刷题记录 八十三【96.不同的二叉搜索树】

前言 动态规划第9篇。记录 八十三【96.不同的二叉搜索树】。 一、题目阅读 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输…

开箱即用的企业级CICD工具-云效流水线 Flow

开箱即用的企业级CICD工具-云效流水线 Flow 开箱即用的企业级CICD工具-云效流水线 Flow资源领取实操来啦编排流水线新建主机组运行流水线运行结果 关于 云效流水线 Flow 的一些看法操作感受新人建议满意与建议流水线Flow 优势 开箱即用的企业级CICD工具-云效流水线 Flow 看到这…

短视频SDK解决方案,降低行业开发门槛

美摄科技匠心打造了一款集前沿技术与极致体验于一体的短视频SDK解决方案,它不仅重新定义了短视频创作的边界,更以行业标杆级的短视频特效,让每一帧画面都闪耀不凡光芒。 【技术赋能,创意无限】 美摄科技的短视频SDK,…

OceanBase V4.3 列存引擎之场景问题汇总

在OceanBase 4.3版本发布后(OceanBase社区版 V4.3 免费下载),其新增的列存引擎,及行列混存一体化的能力,可以支持秒级实时分析,引发了用户、开发者及业界人士的广泛讨论。本文选取了这些讨论中较为典型的一…

Linux系统top命令参数说明

目录 一、top命令概览 二、参数说明 一、top命令概览 二、参数说明 第一行:系统的整体情况概览 top:表示这是个top命令 10:53:55:表示当前系统时间 up 17 days, 19:10:表示系统运行时间 1user:表示当前登录用户人数 load average:表示1分钟/5分钟/15分钟 系统负载…

LangChain 实战案例:老喻干货店的 TextToSql 应用解析

前言 当我们在做项目开发时,数据库设计是项目早期的核心工作之一。我们要考虑业务需要用到的表、关联、索引,并预想出未来核心需求或易产生瓶颈的SQL。当这些事情做完,就可以喝杯咖啡,到前台摸鱼会儿了… 如果你是刚入门数据库学…

出海笔记精华问答 | 第四期

更新出海问答第四期,希望可以继续帮助大家解决问题哈。 Q1:当stripe把资金全退给客户但是货又发了,这是什么情况? A1: 这种情况一般是stripe不跟你合作了或者发生了争议。 Q2:如何知道stripe回复你的邮件是人工回复还是机器人回复&#xff…

Matlab自学笔记三十三:表table类型数据的创建、索引和自身属性的用法

1.表类型的概念 表(table)具有容器特性的数据类型,可以方便的存储混合类型的数据,可以使用数字或命名索引访问数据以及元数据(例如变量名称,行名称,描述和变量单位等); …

Java版自动化测试之Selenium

1. 准备 编程语言:Java JDK版本:17 Maven版本:3.6.1 2. 开始 声明:本次只测试Java的Selenium自动化功能 本次示例过程:打开谷歌游览器,进入目标网址,找到网页的输入框元素,输入指…

基于Java+SpringBoot+Vue的网上租赁系统设计与实现

基于JavaSpringBootVue的网上租赁系统设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式&#x1…

2024硅谷微软和OPENAI的CTO对人工智能发展的最新预测

2024硅谷微软和OPENAI的CTO对人工智能发展的最新预测 微软首席技术官凯文斯科特 在红杉资本(Sequoia Capital)发布的《Training Data》播客中,微软首席技术官凯文斯科特(Kevin Scott)坚定地重申了他对大语言模型&…

从文字到多媒体:GPT如何彻底革新内容创作

近年来,OpenAI开发的GPT(生成预训练变换器)模型在自然语言处理领域引起了广泛关注,尤其是GPT-3的推出,更是掀起了一场技术革新浪潮。然而,GPT模型不仅限于自然语言处理,其多模态应用前景同样令人…

AI大模型领域入门:AI产品经理必备知识指南

随着大模型技术的快速发展,市面上涌现出了大量的大模型产品岗位,那么想要进入AI行业的产品经理同学,需要提前做好哪些准备工作呢?这篇文章里,作者总结了入行AI的必备知识,包括市场调研、产品底层逻辑等内容…

打工人必备工具箱

下载地址:https://pan.quark.cn/s/356d7f201d7a 图片工具 图片格式转换图片转ICO图片压缩图片批量转换图片编辑图片分割 视频工具 视频格式转换视频翻转视频提取音频视频倒放视频静音视频分辨率转换视频旋转视频拼接视频调整音量视频取帧 文档工具 PDF合并PDF提…

Kubernetes--命令行工具 kubectl

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、在任意节点使用 kubectl 1、将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中 [rootk8s-master…

系列:水果甜度个人手持设备检测-前沿方案、论文和思路(一)

系列:水果甜度个人手持设备检测 -- 前沿方案、论文和思路(一) 背景 我们检索最新前沿领域的论文和思路,一般都不会去GitHub、专利官网这种地方,大家都是正常的人类,我们通常会想到中国知网CNKI、中国国家数字图书馆…

【刷题笔记】二叉树3

之前已经介绍过了二叉树的前中后序遍历及层序遍历,这是解决所有二叉树问题的手段。上一期也提到过,很多题既可以用前中后序遍历去做也可以用层序遍历去做。本期就介绍一下例题,分别展示两种做法。 1. 二叉树的右视图 199. 二叉树的右视图 给…

使用 preloadComponents 进行组件预加载

title: 使用 preloadComponents 进行组件预加载 date: 2024/8/18 updated: 2024/8/18 author: cmdragon excerpt: 摘要:本文介绍Nuxt 3中的preloadComponents功能,用于预加载全局注册的组件以减少首次渲染阻塞时间,通过实例演示如何设置并…

EmguCV学习笔记 C# 4.2 二值化

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSD…