• Unity URP入门实战


    导读

    本文讲述

    如何从应用层面使用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;

  • 相关阅读:
    LiveMeida视频接入网关
    温敏AIE双亲多肽分子/AIE磁性荧光微球/多重刺激响应性聚合物纳米微球相关制备
    4本期刊被踢!11月SCI/SSCI目录已更新
    Linux命令总结详细
    【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)
    java毕业设计超市商品管理mybatis+源码+调试部署+系统+数据库+lw
    [微服务]Spring Cloud Sleuth全链路追踪
    C++多线程01
    96. 不同的二叉搜索树
    hadoop生态圈面试精华之zookeeper(二)
  • 原文地址:https://blog.csdn.net/ak47007tiger/article/details/125901578