搭建一个简易的SRP框架

文章目录

    • 关键步骤
      • 1. **定义渲染管线基础结构**:
      • 2. **实现渲染管线实例**:
      • 3. **创建渲染管线资源**:
      • 4. **扩展功能**:
      • 绘制场景(`DrawScene`)方法的实现
      • 集成通用后处理系统
      • 总结

关键步骤

搭建一个简易的可编程渲染管线(Scriptable Render Pipeline, SRP)框架通常涉及到以下几个关键步骤:

1. 定义渲染管线基础结构

创建一个基类来表示自定义渲染管线,继承自Unity的RenderPipelineAsset类。在这个类中,定义必要的属性(如渲染路径、后处理设置等)和方法(如创建和配置渲染管道实例)。

using UnityEngine.Rendering;public class CustomRenderPipeline : RenderPipelineAsset
{[SerializeField] protected RenderingPath renderingPath = RenderingPath.Forward;[SerializeField] protected bool enablePostProcessing = false;protected override IRenderPipeline InternalCreatePipeline(){return new CustomRenderPipelineInstance(renderingPath, enablePostProcessing);}
}

2. 实现渲染管线实例

创建一个类来具体实现渲染流程,继承自RenderPipeline接口。在此类中,定义并实现绘制场景、设置全局渲染状态、处理相机渲染顺序等方法。

using UnityEngine;
using UnityEngine.Rendering;public class CustomRenderPipelineInstance : RenderPipeline
{private readonly RenderingPath _renderingPath;private readonly bool _enablePostProcessing;public CustomRenderPipelineInstance(RenderingPath renderingPath, bool enablePostProcessing){_renderingPath = renderingPath;_enablePostProcessing = enablePostProcessing;}protected override void Render(ScriptableRenderContext context, Camera[] cameras){foreach (var camera in cameras){// 清除颜色和深度缓冲区context.ClearRenderTarget(true, true, Color.clear);// 设置全局渲染状态(如深度测试、混合模式等)context.SetupCameraProperties(camera);// 绘制场景DrawScene(context, camera, _renderingPath);// 如果启用,应用后处理效果if (_enablePostProcessing){ApplyPostProcessing(context, camera);}}}private void DrawScene(ScriptableRenderContext context, Camera camera, RenderingPath renderingPath){// 根据渲染路径选择不同的绘制策略(如Forward、Deferred等)switch (renderingPath){case RenderingPath.Forward:// 绘制前向渲染所需对象(如天空盒、普通物体等)break;case RenderingPath.DeferredLighting:// 绘制延迟光照所需对象(如GBuffer填充、光照计算等)break;// ...}}private void ApplyPostProcessing(ScriptableRenderContext context, Camera camera){// 实现或使用现有的后处理组件/系统来处理相机的渲染结果}
}

3. 创建渲染管线资源

在Unity编辑器中创建一个新的脚本(如CustomRenderPipelineAsset.cs),并在其中实现上述的CustomRenderPipeline类。将其拖入项目资产面板,即可在项目的设置中选择使用该自定义渲染管线。

4. 扩展功能

根据需求,可以进一步扩展渲染管线的功能,如添加光照系统、阴影处理、定制化渲染队列、支持不同渲染路径(如前向、延迟等)、集成后处理栈、支持SRP Batcher优化等。这些扩展通常涉及编写更多的渲染相关代码,并可能需要创建额外的组件或系统来协同工作。

搭建一个简易的SRP框架的核心在于理解Unity的渲染流程,并通过ScriptableRenderContext API来控制渲染过程。上述示例提供了一个基本的框架结构,具体的渲染逻辑需要根据实际需求进行填充和完善。在实际项目中,可能还需要结合Unity的官方文档、教程及社区资源进行深入学习和实践。

让我们继续完善这个简易SRP框架的实现。在之前的回答中,我们已经建立了基础的渲染管线结构和实例类。接下来,我们将填充关键的绘制场景方法(DrawScene)以及示例性地实现一个简单的前向渲染路径。同时,为了演示后处理的集成,我们将使用Unity内置的通用后处理系统(Universal Post Processing Stack)。以下是详细的补充内容:

绘制场景(DrawScene)方法的实现

针对前向渲染路径,我们需要绘制天空盒(如果存在)、场景中的不透明物体以及透明物体。在CustomRenderPipelineInstance类中,修改DrawScene方法如下:

private void DrawScene(ScriptableRenderContext context, Camera camera, RenderingPath renderingPath)
{if (renderingPath == RenderingPath.Forward){// 绘制天空盒if (camera.clearFlags == CameraClearFlags.Skybox && camera.skybox != null){context.DrawSkybox(camera);}// 分别绘制不透明物体和透明物体var drawSettings = new DrawRendererSettings(camera, new ShaderPassName("ForwardBase")){sortingSettings = new SortingSettings(camera){criteria = SortingCriteria.CommonOpaque},rendererConfiguration = RendererConfiguration.PerObjectLightmaps | RendererConfiguration.PerObjectLightProbe};var filterSettings = new FilterRenderersSettings(true){renderQueueRange = RenderQueueRange.opaque,};context.DrawRenderers(cullingResults, ref drawSettings, filterSettings);drawSettings.sortingSettings.criteria = SortingCriteria.CommonTransparent;filterSettings.renderQueueRange = RenderQueueRange.transparent;context.DrawRenderers(cullingResults, ref drawSettings, filterSettings);}
}

这里我们使用了ScriptableRenderContext提供的DrawSkyboxDrawRenderers方法来绘制天空盒和场景中的不透明、透明物体。注意,这只是一个基础的前向渲染实现,实际项目中可能需要考虑更复杂的光照模型、材质特性等因素。

集成通用后处理系统

为了简化后处理的实现,我们使用Unity的内置通用后处理系统(Universal Post Processing Stack)。首先,确保已安装该插件。然后,在ApplyPostProcessing方法中添加如下代码:

using UnityEngine.Rendering.PostProcessing;private void ApplyPostProcessing(ScriptableRenderContext context, Camera camera)
{var commandBuffer = new CommandBuffer { name = "Universal Post Process" };var postProcessLayer = camera.GetComponent<PostProcessLayer>();if (postProcessLayer != null && postProcessLayer.isActiveAndEnabled){postProcessLayer.Render(commandBuffer, context);}context.ExecuteCommandBuffer(commandBuffer);commandBuffer.Dispose();
}

这里我们创建了一个命令缓冲区(CommandBuffer),用于执行后处理操作。通过获取PostProcessLayer组件并调用其Render方法,将后处理效果应用到当前相机的渲染结果上。最后,执行命令缓冲区并释放资源。

总结

至此,我们已经完成了一个简易SRP框架的基本实现,包括前向渲染路径的绘制和通用后处理系统的集成。这个框架可以作为进一步开发和扩展的基础,例如添加对其他渲染路径的支持、定制光照系统、优化渲染性能等。在实际项目中,请根据具体需求调整和优化此框架。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

被删除的照片如何恢复?教你几分钟快速找回!

误删手机数据是我们日常生活中经常发生的操作&#xff0c;例如在清理手机内存、释放空间的时候&#xff0c;总会因为操作失误然后将照片误删&#xff0c;或者因为手机出现故障导致照片被删除。那这时候我们该怎么挽回这些数据呢&#xff1f; 被删除的照片如何恢复呢&#xff1…

【Linux系统编程】第六弹---权限的概念

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是权限 2、权限的本质 3、Linux中的用户 4、Linux中文件的权限 4.1、文件访问者的分类(角色) 4.2、文件类型和访问权…

每日算法4/21

LCR 073. 爱吃香蕉的狒狒 题目 狒狒喜欢吃香蕉。这里有 N 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 H 小时后回来。 狒狒可以决定她吃香蕉的速度 K &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选…

使用甘特图来做时间管理

在这个追求效率的时代,掌握高超的时间管理技能几乎等同于掌控了成功。事实上,时间就是金钱,更是稀缺资源。那么,如何高效地规划和利用时间呢?甘特图应该是您的必备武器之一。 甘特图(Gantt chart)名字虽然有些陌生,但它的使用范围确实广泛。无论是全职妈妈安排家务,还是上市公…

电子印章盖骑缝章

电子印章盖骑缝章是指在电子文档&#xff08;如PDF文件&#xff09;中&#xff0c;使用电子印章技术&#xff0c;为文档添加一个跨越多页、连续显示的电子印章图像&#xff0c;以模拟传统纸质文档上的骑缝章效果。以下是实现电子印章盖骑缝章的步骤&#xff1a; 一. 准备电子印…

【Qt】探索Qt框架:跨平台GUI开发的利器

文章目录 1. Qt框架概述1.1. Qt框架的优点1.2. Qt框架支持的系统1.3. Qt开发环境 2. 搭建 Qt 开发环境2.1. Qt SDK 的下载和安装2.2. 新建项目: 3. Qt 框架内容简介总结 在当今软件开发领域&#xff0c;跨平台性和用户界面的友好性是至关重要的。而Qt框架作为一款跨平台的C图形…

使用CipherTrust透明加密勒索软件保护阻止勒索软件的传播

Thales实验室对十起勒索攻击的软件进行测试&#xff0c;效果理想。另外对于这些常见的勒索攻击方式也进行了大量模拟&#xff0c;都很好的进行了保护。 BleepingComputer.com上的文章涵盖了过去几个月(2024年1月至3月)最近的勒索软件攻击。本博客将展示&#xff0c;如果在这些受…

基于springboot实现大型商场应急预案管理系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现大型商场应急预案管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大型商场应急预案管理系统的开发全过程。通过分析大型商场应急预案管理系统管理的不足&#xff0c;创建了一个…

Vue2 —— 学习(十)

一、vue-resource 库 了解即可 在之前的 vue 版本中经常使用 这个库发送 ajax 请求 现在建议使用 axios 我们可以通过使用 vue-resource 库 来实现发送 ajax 请求 它是 vue 的一个插件库 Vue.use() 就能使用我们的插件了 我们引入后去 我们的实例对象 vc 中查看 发现出现…

如何增强Java GCExcel API 的导入和导出性能

前言 GrapeCity Documents for Excel (以下简称GcExcel) 是葡萄城公司的一款服务端表格组件&#xff0c;它提供了一组全面的 API 以编程方式生成 Excel (XLSX) 电子表格文档的功能&#xff0c;支持为多个平台创建、操作、转换和共享与 Microsoft Excel 兼容的电子表格&#xf…

前端工程化02-复习jQuery当中的插件开发

2、jQuery插件开发 在我们开发的时候、有时候jQuery提供的方法并不能满足我们的需求&#xff0c;如果我们想给jQuery扩展一些其他的方法&#xff0c;那这种情况下&#xff0c;可能会需要写一个插件 jQurey官网&#xff1a;jquery.com 例如一些、图片懒加载插件、滚动的插件、…

自动售卖团餐:借助智享直播AI实景无人直播系统,团餐自动售卖,无需人工参与,省时高效。

在科技飞速发展的今天&#xff0c;直播行业迎来了一场前所未有的变革。过去&#xff0c;传统的直播方式需要大量设备和人力投入&#xff0c;然而如今&#xff0c;一款名为"智享直播"的AI实景无人直播系统正以其简单、有趣的特性改变着这一局面。仅仅凭借一部手机&…