关于使用自定义渲染通道的绘制
此页面包含有关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. 确保绘制所需的资源并获取绘制所需的数据
声明以下纹理为绘制所需资源。
- 活动颜色纹理
- 活动深度纹理
- 模型绘制的纹理
- 使用高级混合模式时,用作临时绘制目标使用的纹理。
- 用于绘制蒙版的纹理
绘制处理所需的以下数据保存为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中的绘制负载。