文章

基于URP14的后处理

基于URP14的后处理

基于URP14的后处理

00 前言

URP14引入了RTHadle作为RenderTexture的替代进行管理, 写法上也有很多的不同.

01 整体结构

整体结构仍旧由4部分构成

  • RendererFeature
  • RenderPass
  • Volume
  • Shader

02 RendererFeature

RendererFeature作为向Render中添加Pass的一个容器来进行运作. 因为直接向Renderer中添加Pass意味着对源码进行修改, 为了解耦和增加定制, Unity提供了RendererFeature来向Renderer中添加Pass.

RendererFeature通常做三件事情, 都是针对RenderPass本身

  • Create()

    • 通过RenderPass的构造函数创建RenderPass实例

      1
      2
      3
      4
      
      public override void Create()
      {
          _Pass = new Pass(RenderPassEvent.BeforeRenderingPostProcessing);
      }
      
  • AddRenderPasses()

    • 将该实例加入renderer的Pass队列

      1
      2
      3
      4
      
      public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
      {
          renderer.EnqueuePass(_Pass);
      }
      
  • Dispose()

    • 善后工作

      1
      2
      3
      4
      5
      
      protected override void Dispose(bool disposing)
      {
          _bloomPass.Dispose();
          _bloomPass.CleanUp();
      }
      

03 RenderPass

真正要加入的RenderPass本身.

  • 构造函数
    • 通过构造函数进行初始值的设置:
      • 实例化RTHandle
      • 给RenderPassEvent赋值
      • 实例化Material
  • Excute()
    • 实例化CommandBuffer
    • 调用CommandBuffer进行渲染
    • 释放CommandBuffer
    • 因为CommandBuffer的一套操作基本是相同的, 所以会单独用一个Render()函数去处理渲染相关的部分
  • Dispose()
    • 一般来说, 在构造函数中实例化的RTHandle和材质球都需要进行销毁和释放
    • 本着自己实例化, 自己销毁/释放的原则, 将这部分操作写在Dispose中供RendererFeature调用.
  • cmd.blit替换为BlitterAPI

04 Volume

面板, 参数, 除了渲染时机之外, 都建议在这里进行管理

05 Shader

负责渲染的着色器

注意以下几点

  • 主贴图: TEXTURE2D_X(_BlitTexture);

  • 对应的Size: float4 _BlitTexture_TexelSize;

  • 顶点着色器使用Blit.hlsl文件中的Vert进行扩展和改写.

  • 片元着色器记得加入以下两行

    1
    2
    
    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);
    float2 uv = UnityStereoTransformScreenSpaceTex(input.texcoord);
    

06 研究

RenderTargetBufferSystem.cs

该系统关系到_CameraColorAttachmentA_CameraColorAttachmentB的交换问题, 如果能利用, 能减少一次全屏Blit.

参考

What’s new in URP 14 (Unity 2022.2) | Universal RP | 14.0.8 (unity3d.com)

Perform a full screen blit in URP | Universal RP | 14.0.8 (unity3d.com)

【Unity-2022】URP14 - Post Stack API - 模糊库 - 知乎 (zhihu.com)

Unity URP14.0 自定义后处理系统 - 知乎 (zhihu.com)

Class Blitter | Core RP Library | 13.1.9 (unity3d.com)

C# 结合 using 语句块的三种实用方法 - MyZony - 博客园 (cnblogs.com)

URP Blit 入门 - 知乎 (zhihu.com)

本文由作者按照 CC BY 4.0 进行授权