Catlike Coding Custom SRP笔记 - SRP项目搭建

news/2025/1/16 22:01:58/文章来源:https://www.cnblogs.com/sailJs/p/18616633

什么是SRP?

可编程渲染管线 (Scriptable Render Pipeline) 是 Unity 内置渲染管线的替代方案。 使用 SRP 可以通过 C# 脚本控制和定制渲染流程

 

URP和SRP的区别? 

URP是基于SRP实现的一套渲染管线(由Unity官方实现,并以模板项目的方式提供给开发者使用)

 

LWRP又是啥?

轻量级渲染管线(Lightweight Render Pipeline), 其实就是URP的前身,Unity2020版本开始更名为URP。

 

创建SRP项目

这边使用Unity2021

空的SRP项目

  

代码部分

自定义渲染管线主要实现RenderPipelineAsset和RenderPipeline

 

1) RenderPipelineAsset子类,用于创建并返回自定义的RenderPipleline

CustomRenderPipelineAsset.cs

[CreateAssetMenu(menuName = "Rendering/Custom Render Pipeline")]
public class CustomRenderPipelineAsset : RenderPipelineAsset {
protected override RenderPipeline CreatePipeline () {return new CustomRenderPipeline();}
}

 

2) RenderPipeline子类,用于定制渲染

 CustomRenderPipeline.cs

public class CustomRenderPipeline : RenderPipeline {CameraRenderer renderer = new CameraRenderer();protected override void Render(ScriptableRenderContext context, Camera[] cameras) {}protected override void Render(ScriptableRenderContext context, List<Camera> cameras) {for (int i = 0; i < cameras.Count; i++) {renderer.Render(context, cameras[i]);}}}

 

 CameraRenderer.cs

public partial class CameraRenderer {const string bufferName = "Render Camera";static ShaderTagId unlitShaderTagId = new ShaderTagId("SRPDefaultUnlit");CommandBuffer buffer = new CommandBuffer {name = bufferName};ScriptableRenderContext context;Camera camera;CullingResults cullingResults;public void Render(ScriptableRenderContext context, Camera camera) {this.context = context;this.camera = camera;#if UNITY_EDITORPrepareBuffer();PrepareForSceneWindow();
#endifif (!Cull()) {return;}Setup();DrawVisibleGeometry();
#if UNITY_EDITORDrawUnsupportedShaders();DrawGizmos();
#endifSubmit();}bool Cull() {if (camera.TryGetCullingParameters(out ScriptableCullingParameters p)) {cullingResults = context.Cull(ref p);return true;}return false;}void Setup() {context.SetupCameraProperties(camera);CameraClearFlags flags = camera.clearFlags;buffer.ClearRenderTarget(flags <= CameraClearFlags.Depth,flags <= CameraClearFlags.Color,(flags == CameraClearFlags.Color) ? camera.backgroundColor.linear : Color.clear);buffer.BeginSample(SampleName);ExecuteBuffer();}void Submit() {buffer.EndSample(SampleName);ExecuteBuffer();context.Submit();}void ExecuteBuffer() {context.ExecuteCommandBuffer(buffer);buffer.Clear();}void DrawVisibleGeometry() {//先渲染不透明物体var sortingSettings = new SortingSettings(camera) {criteria = SortingCriteria.CommonOpaque};var drawingSettings = new DrawingSettings(unlitShaderTagId, sortingSettings);var filteringSettings = new FilteringSettings(RenderQueueRange.opaque);context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);//再渲染天空盒
        context.DrawSkybox(camera);//再渲染半透明物体sortingSettings.criteria = SortingCriteria.CommonTransparent;drawingSettings.sortingSettings = sortingSettings;filteringSettings.renderQueueRange = RenderQueueRange.transparent;context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);}}

 

CameraRenderer.Editor.cs

partial class CameraRenderer {#if UNITY_EDITOR//内置渲染管线的tag标识static ShaderTagId[] legacyShaderTagIds = {new ShaderTagId("Always"),new ShaderTagId("ForwardBase"),new ShaderTagId("PrepassBase"),new ShaderTagId("Vertex"),new ShaderTagId("VertexLMRGBM"),new ShaderTagId("VertexLM")};static Material errorMaterial;string SampleName { get; set; }void DrawGizmos() {if (Handles.ShouldRenderGizmos()) {context.DrawGizmos(camera, GizmoSubset.PreImageEffects);context.DrawGizmos(camera, GizmoSubset.PostImageEffects);}}//shader错误时, 显示为粉红void DrawUnsupportedShaders() {if (errorMaterial == null) {errorMaterial = new Material(Shader.Find("Hidden/InternalErrorShader"));}var drawingSettings = new DrawingSettings(legacyShaderTagIds[0], new SortingSettings(camera)) {overrideMaterial = errorMaterial};for(int i = 1; i < legacyShaderTagIds.Length; i++) {drawingSettings.SetShaderPassName(i, legacyShaderTagIds[i]);}var filteringSettings = FilteringSettings.defaultValue;context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);}void PrepareForSceneWindow() {if (camera.cameraType == CameraType.SceneView) {ScriptableRenderContext.EmitWorldGeometryForSceneView(camera); //渲染ugui的几何图形
        }}void PrepareBuffer() {Profiler.BeginSample("Editor Only"); //Window -> Analysis -> Profile -> CPU Usage:Hierarchy中会显示buffer.name = SampleName = camera.name; //编辑器下BeginSample使用相机名字, Player下使用固定名字(Render Camera)
        Profiler.EndSample();}#elseconst string SampleName = bufferName;
#endif}

 

修改渲染管线配置

右键 -> 新建一个渲染管线asset

菜单 -> Edit -> Project Settings,切换到Quality页签,添加一个品质条目,并关联我们新建的asset

至此,SRP的模板项目搭好了 

 

参考

Custom Render Pipeline

【URP CatlikeCoding学习笔记】1/17 基础渲染管线 - 知乎

 Unity自定义SRP(一):构建渲染框架 - 简书

 Unity可编程渲染管线(SRP)教程:一、自定义管线 - 知乎

 

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

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

相关文章

使用 Perspective 为 AI 艺术添加真实世界的深度

使用 Perspective 为 AI 艺术添加真实世界的深度 📖阅读时长:10分钟 🕙发布时间使用 Perspective 为 AI 艺术添加真实世界的深度 📖阅读时长:10分钟 🕙发布时间:2025-01-16近日热文:全网最全的神经网络数学原理(代码和公式)直观解释 欢迎关注知乎和公众号的专栏内…

字节跳动发布开源 Lip Sync AI 模型,视频换声对口型超轻松!

ByteDance新开源模型LatentSync,视频换声对口型超轻松! 阅读时长:9分钟 论文地址ByteDance新开源模型LatentSync,视频换声对口型超轻松!阅读时长:9分钟 论文地址: https://arxiv.org/pdf/2412.09262 发布时间:2025年1月8日字节跳动最近推出了LatentSync,这是一款全新的…

MobaXterm(远程终极工具箱) v24.4汉化专业版

MobaXterm是一款集多种远程功能于一身的工具,它通过支持SSH、Telnet、RDP、VNC等协议,让用户能够轻松远程连接至不同操作系统,如Linux、Unix和Windows。此外,它还具备文件传输功能,支持SCP、SFTP、FTP协议,方便用户在本地与远程设备间传输文件。关键特性图形界面支持:可…

https证书一键自动续期,帮你解放90天限制

前言 前几天网站证书到期,发觉证书颁发每次只能90天有效期,这谁能忍受,于是乎发觉网上有免费的一键续期脚本,真正解放我们的双手。项目如下acme.sh。 期间由于"墙"的原因,踩了很多的坑,此文记录一下踩坑的过程,同时也帮助我们"墙内"的程序员,不需要…

对rpc长连接与短连接的思考

RPC项目中长连接和短连接各有优劣,长连接适用于少量客户端,提高效率;短连接则更适合大量客户端,避免服务器过载。结合L4和L7负载均衡,合理选择连接方式,提升系统性能和稳定性。对rpc长连接与短连接的思考 对于rpc项目,在接受大佬指导的时候曾问过对于长连接和短连接是如…

【Windows攻防】通过代码研究空字节和无文件方式注册表隐藏技术

这篇文章收录于《取证实录》第四季中。 注册表隐藏技术通常用于恶意软件、后门程序或攻击者企图在系统中保持隐蔽,绕过安全检查和防御系统。 常见的隐藏技术有:使用非法字符隐藏注册表项(如PlugX、TDL4/Alureon(Rootkit))、利用默认键值(空字符串)隐藏(如Adwind RAT)…

DVWA靶场学习

暴力破解Brute Force low 输入密码就正常抓包放字典破解得了uploading-image-528180.png medium 同样的操作发现响应速度变慢了,但是还是能暴力破解,不多说了。 uploading-image-408161.png 部分源码解读 $user = $_GET[username]; $user = ((isset($GLOBALS["___mysqli…

推荐几个不错的 Linux 服务器管理工具

前言 选择一款好的 Linux 服务器管理工具能够极大地提高运维效率,保障业务连续性。今天大姚给大家分享3款不错的 Linux 服务器管理工具,希望可以帮助到有需要的同学。 1Panel 1Panel是新一代的 Linux 服务器运维管理面板,旨在通过现代化的 Web 界面帮助用户轻松管理 Linux 服…

学习进度笔记⑩

Tensorflow线性回归 源代码:import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport osos.environ["CUDA_VISIBLE_DEVICES"]="0"#设置训练参数,learning_rate=0.01,training_epochs=1000,display_step=50learning_rate=0.01…

学习进度笔记⑨

tensorflow基本操作(类似numpy) 源代码import tensorflow as tf import os os.environ["CUDA_VISIBLE_DEVICES"]="0" #构造计算图,创建两个常量节点a,b,值分别为2,3 a=tf.constant(2) b=tf.constant(3) #创建一个Session会话对象,调用run方法,运行…

利用AI大模型实现个性化视频配音

最近,作者决定拍摄短视频分享AI技术的应用,并遇到了配音问题。由于家中环境嘈杂且设备不够专业,作者尝试了机器配音,但效果不佳。作者转而想到AI大模型支持语音识别,于是开始寻找语音合成模型。最终在阿里云百炼平台上找到了通义千问-语音合成CosyVoice大模型,多个音色都…

【取证工具】Magnet AXIOM中文绿色版(更新8.4)

Magnet AXIOM取证工具介绍 Magnet AXIOM 是一款功能强大的数字取证工具,专为法律执行人员、调查员和安全专家设计,用于从各种数字设备中提取、分析和报告证据。AXIOM 提供了全面的取证支持,能够从电脑、移动设备、云端服务以及物联网设备中收集并分析数据。多平台支持 Magne…