|
导读
本文讲述
如何从应用层面使用URP
如何在代码层面为URP增加更多的渲染特性
如果拓展URP的后处理效果
URP管线特性
光源数量:
直线光外加4个其他光源
内置管线的多Pass Forward Rendering,会在多光源时对额外的光源使用新的FowardAdd Pass计算,Pass数量是影响物体的光源数量,最大值为8
缺点:
1 不支持多相机叠加
2 Defferred Renderring,现在URP里面没有延迟渲染,也没有时域抗锯齿TAA
使用URP的第一步是配置URP的Asset
获得2个配置文件
改个名字
设置图形选项
配置质量选项
不配置这个在Camera里面选不了Renderer
配置后处理
拖上去
为URP增加新的渲染特性:CustomRenderPassFeature
原理:XXXFeature类提供XXXPass给Renderer,以此增加一个渲染特性
此时会得到一个RenderFeature类
里面有模板代码,可以按需拓展
拓展后处理
拓展URP后处理的原理
使用一个在最后才执行的Pass,对当前相机的渲染输出进行处理
步骤
1 新建类继承Volume,这一步是为了给后处理提供数据设置。可以不做这一步,因为可以直接走RenderFeature的配置里读也可以
2 增加一个renderer feature,在这个Feature中创建自定义pass,在pass里进行后处理
后处理用的shader
使用Shader Graph或者自己写一个URP的shader,用这个shader建一个材质,使用这个材质完成后处理
有个要注意的是,如果不想做额外的设置,shader里的输入贴图名字写死叫 _MainTex
后处理用的自定义RenderPassFeature示例代码
- using UnityEngine;
- using UnityEngine.Rendering;
- using UnityEngine.Rendering.Universal;
- public class TestUrpPostRenderPassFeature : ScriptableRendererFeature
- {
- public Material postMat;
- class CustomRenderPass : ScriptableRenderPass
- {
- private int effectRtPropId = Shader.PropertyToID("testUrpRt");
- private RenderTargetIdentifier effectRtId;
- private RenderTargetIdentifier source;
- public Material postMat;
- public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
- {
- source = renderingData.cameraData.renderer.cameraColorTarget;
- RenderTextureDescriptor descriptor = renderingData.cameraData.cameraTargetDescriptor;
- descriptor.depthBufferBits = 0;
- cmd.GetTemporaryRT(effectRtPropId, descriptor, FilterMode.Bilinear);
- effectRtId = new RenderTargetIdentifier(effectRtPropId);
- // Debug.Log("custom urp setup camera");
- }
- public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
- {
- CommandBuffer cmd = CommandBufferPool.Get("Custom Post Processing");
- cmd.Clear();
- Blit(cmd, source, effectRtId, postMat);
- Blit(cmd, effectRtId, source);
- context.ExecuteCommandBuffer(cmd);
- CommandBufferPool.Release(cmd);
- // Debug.Log("custom urp execute");
- }
- public override void OnCameraCleanup(CommandBuffer cmd)
- {
- cmd.ReleaseTemporaryRT(effectRtPropId);
- // Debug.Log("custom urp release");
- }
- }
- CustomRenderPass m_ScriptablePass;
- public override void Create()
- {
- m_ScriptablePass = new CustomRenderPass();
- m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;
- m_ScriptablePass.postMat = postMat;
- }
- public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
- {
- renderer.EnqueuePass(m_ScriptablePass);
- }
- }
复制代码 参考资料
应用方面的介绍看官方文档
Shader Stripping | Package Manager UI website
实现分析和讲解
[Universal RP]Unity通用渲染管线学习 - 知乎
后处理的参考资料
renderer feature:
Unity3D URP中使用Render Feature实现后处理效果 - whcsrl_技术网
Custom Post Processing in Unity URP | Febucci
volume
代码
获得当前相机的输出RenderTargetIdentifier
var renderer = renderingData.cameraData.renderer;
source = renderer.cameraColorTarget; |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|