关于使用自定义渲染通道的绘制

此页面包含有关Beta版的描述。

Cubism 5 SDK for Unity R5 beta 3现在支持Universal Render Pipeline(以下称为URP),由此所有Cubism模型的绘制处理都将通过自定义渲染通道完成。

自定义渲染通道概述

Cubism SDK for Unity的自定义渲染通道在RenderGraph中以Cubism URP Render Pass名称注册。
RenderPassEvent设置为RenderPassEvent.BeforeRenderingTransparents,在透明物体绘制前进行处理。

public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
    const string renderCustomPass = "Cubism URP Render Pass";

    ~~~~~~
}


public override void Create()
{
    _mScriptablePass = new CubismRenderPass
    {
        // Configures where the render pass should be injected.
        renderPassEvent = RenderPassEvent.BeforeRenderingTransparents
    };
}

请为每个项目设置易于使用的RenderPassEvent。

关于自定义渲染通道的处理和负载

自定义渲染通道统一了绘制模型所需的处理。

主要资源由自定义渲染通道确保

Cubism 5 SDK for Unity R5 beta 3中新增了以下资源,这些资源对性能有特别的影响。

  • 模型绘制的纹理
  • 使用高级混合模式时,用作临时绘制目标使用的纹理。
  • 用于绘制蒙版的纹理

这些确保为纹理手柄,并根据绘制Cubism模型的相机的渲染目标信息生成纹理。

处理流程

自定义渲染通道中每一帧的绘制处理流程如下所示:

  1. 确保绘制所需的资源并获取绘制所需的数据
  2. 绘制顺序的计算
  3. 每个模型的绘制
  4. 将绘制结果应用到相机的渲染目标

1. 确保绘制所需的资源并获取绘制所需的数据

声明以下纹理为绘制所需资源。

  • 活动颜色纹理
  • 活动深度纹理
  • 模型绘制的纹理
  • 使用高级混合模式时,用作临时绘制目标使用的纹理。
  • 用于绘制蒙版的纹理

绘制处理所需的以下数据保存为CubismRenderPass.PassData。

  • 用于绘制的所有模型的CubismRenderController
  • 按照各Grouped Sorting Index和Grouped Sorting Index汇总的CubismRenderController数组
  • 从URP传递的相机数据
  • 从URP传递的资源数据
  • 用于绘制蒙版的纹理手柄
  • 活动的颜色纹理把手
  • 活动的深度纹理手柄
  • 模型所绘制的纹理的把手
  • 在使用高级混合模式时用作临时绘制目标的纹理手柄

2. 绘制顺序的计算

当使用绘制顺序用排序索引、或者SortByDepth时,与相机的距离与前一帧不同时等,将更新绘制顺序。
如果发生更新,还会检查哪个Drawable将是最后绘制处理的,并设置一个标志。

3. 每个模型的绘制

首先,将绘制目标切换到模型将要绘制到的纹理。

然后,在对模型的每个绘制物件进行绘制处理前,会执行一个处理来确认每个绘制物件是否要执行绘制处理。
一旦确定要绘制哪个物体,就会按照绘制顺序调用必要的绘制处理。

此外,在绘制物件的绘制处理调用前后都会调用绘制中断功能。
有关详细信息,请参考“绘制中断功能”。

4. 将绘制结果应用到相机的渲染目标

在默认设置中按照每个Grouped Sorting Index(以下简称“组”)应用到相机渲染目标。
有关Grouped Sorting Index的功能信息,请确认“关于Grouped Sorting Index”。

按照每个Grouped Sorting Index(以下简称“组”)应用到相机渲染目标的功能,是为了防止混合模式影响同一组之外的绘制物件(模型)。

如果禁用此设置,混合模式将影响所有已绘制的绘制物件(模型),无论它们是否在同一组中,但当组的数量很多时,性能会得到改善。
有关详细信息,请参考“关于负载”。

无论设置如何,混合模式都会影响同一组内绘制的绘制物件,无论这些绘制物件是否属于不同的模型。

关于Grouped Sorting Index

这是将模型分组进行绘制处理的Cubism SDK for Unity的一个独特功能。每个模型按照各CubismRenderController.GroupedSortingIndex控制绘制顺序。
即使变更CubismRenderController.SortingOrder或座标,具有不同CubismRenderController.GroupedSortingIndex的模型的绘制顺序也不会改变。

在Cubism 5 SDK for Unity R4_1及更早版本中,绘制顺序仅由CubismRenderController.SortingOrder和座标控制,尤其是在使用SortingByOrder时,必须将CubismRenderController.SortingOrder的值设置为与原始值显著不同的值,以防止模型相互交叉。
这是因为通过将CubismRenderController.SortingOrder(模型全体绘制顺序)相加到CubismRenderer.SortingOrder(模型各Drawable的SortingOrder)中,变更了绘制顺序。

在Cubism 5 SDK for Unity R5 beta 3中,根据Grouped Sorting Index,现在允许您独立于CubismRenderController.SortingOrder设置模型的前后顺序。

关于负载

自定义渲染通道会影响性能的项目如下所示:

Grouped Sorting Index

默认设置(有效)下,DrawMesh将针对每个Grouped Sorting Index执行,以将绘制结果应用到相机的渲染目标。
受此影响,绘制调用的数量会随着Grouped Sorting Index的唯一数量增加而增加。

要切换此设置,请操作标志CubismRenderControllerGroup.IsCopiedToCameraTexture。
默认值为true。

如果禁用此设置,则根据每个Grouped Sorting Index的DrawMesh的应用将被跳过,并且在所有模型绘制完成后,只会向相机的渲染目标应用一次。
混合模式对已绘制的绘制物件产生影响的同时,与设置有效时相比,绘制的Grouped Sorting Index的唯一数量越多,则性能将得到改善。

场景视图

在Unity Editor中,由于场景视图的绘制特性,某些部分将进行追加的处理。
这会略微增加Unity Editor中的绘制负载。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。