找回密码
 立即注册
查看: 384|回复: 0

Unity URP入门实战

[复制链接]
发表于 2023-4-19 09:07 | 显示全部楼层 |阅读模式
导读

本文讲述

如何从应用层面使用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示例代码
  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. using UnityEngine.Rendering.Universal;
  4. public class TestUrpPostRenderPassFeature : ScriptableRendererFeature
  5. {
  6.     public Material postMat;
  7.     class CustomRenderPass : ScriptableRenderPass
  8.     {
  9.         private int effectRtPropId = Shader.PropertyToID("testUrpRt");
  10.         private RenderTargetIdentifier effectRtId;
  11.         private RenderTargetIdentifier source;
  12.         public Material postMat;
  13.         public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
  14.         {
  15.             source = renderingData.cameraData.renderer.cameraColorTarget;
  16.             RenderTextureDescriptor descriptor = renderingData.cameraData.cameraTargetDescriptor;
  17.             descriptor.depthBufferBits = 0;
  18.             cmd.GetTemporaryRT(effectRtPropId, descriptor, FilterMode.Bilinear);
  19.             effectRtId = new RenderTargetIdentifier(effectRtPropId);
  20.             // Debug.Log("custom urp setup camera");
  21.         }
  22.         public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  23.         {
  24.             CommandBuffer cmd = CommandBufferPool.Get("Custom Post Processing");
  25.             cmd.Clear();
  26.             Blit(cmd, source, effectRtId, postMat);
  27.             Blit(cmd, effectRtId, source);
  28.             context.ExecuteCommandBuffer(cmd);
  29.             CommandBufferPool.Release(cmd);
  30.             // Debug.Log("custom urp execute");
  31.         }
  32.         public override void OnCameraCleanup(CommandBuffer cmd)
  33.         {
  34.             cmd.ReleaseTemporaryRT(effectRtPropId);
  35.             // Debug.Log("custom urp release");
  36.         }
  37.     }
  38.     CustomRenderPass m_ScriptablePass;
  39.     public override void Create()
  40.     {
  41.         m_ScriptablePass = new CustomRenderPass();
  42.         m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;
  43.         m_ScriptablePass.postMat = postMat;
  44.     }
  45.     public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
  46.     {
  47.         renderer.EnqueuePass(m_ScriptablePass);
  48.     }
  49. }
复制代码
参考资料

应用方面的介绍看官方文档
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;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-29 17:32 , Processed in 0.088808 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表