示例:如何使用渲染对象渲染器功能 (Render Objects Renderer Feature) 创建自定义渲染效果
本页上的示例说明如何使用渲染对象渲染器功能创建自定义渲染效果。
示例概述
本页的示例将演示如何实现以下效果:
场景中有一个角色。
当角色位于游戏对象后面时,Unity 会使用不同的材质绘制角色的轮廓。
先决条件
此示例需要满足以下条件:
一个安装了 URP 包的 Unity 项目。
Scriptable Render Pipeline Settings 属性引用一个 URP 资源 (Project Settings > Graphics > Scriptable Render Pipeline Settings)。
创建示例场景和游戏对象
要按照此示例中的步骤操作,请创建一个包含以下游戏对象的新场景:
创建一个立方体。设置其 Scale 值,使其看起来像一堵墙。
创建一个材质并将其分配给
Universal Render Pipeline/Lit
着色器。选择基色(例如,红色)。将材质命名为Character
。创建一个基本角色并为其分配 Character 材质。在此示例中,角色由三个胶囊体组成:中间的大胶囊体代表身体,两个较小的胶囊体代表双手。
为了更容易在场景中操作角色,请添加三个胶囊体作为 Character 游戏对象下的子游戏对象。
创建一个材质并将其分配给
Universal Render Pipeline/Unlit
着色器。选择您希望角色位于游戏对象后面时的基色(例如,蓝色)。将材质命名为CharacterBehindObjects
。
现在已经完成了执行此示例中的步骤所需的设置。
实现示例
本节假设已按照示例场景和游戏对象一节所述创建了一个场景。
此实现示例使用了两个渲染对象渲染器功能:一个用于绘制位于其他游戏对象后面的角色部分,另一个用于绘制位于其他游戏对象前面的角色部分。
创建一个渲染器功能来绘制游戏对象后面的角色
按照以下步骤创建一个渲染器功能来绘制游戏对象后面的角色。
选择一个 URP 渲染器。
在 Inspector 中,单击 Add Renderer Feature,然后选择 Render Objects。
选择 Name 字段,然后输入新渲染器功能的名称,例如 DrawCharacterBehind。
此示例使用层 (Layers) 来过滤要渲染的游戏对象。创建一个新层并将它命名为 Character。
在
DrawCharacterBehind
渲染器功能的 Filters > Layer Mask 中,选择Character
。使用这项设置,此渲染器功能仅渲染Character
层中的游戏对象。在 Overrides > Material 中,选择
CharacterBehindObjects
材质。渲染器功能使用选定的材质覆盖游戏对象的材质。
预期行为是仅当角色位于其他游戏对象后面时,渲染器功能才使用
CharacterBehindObjects
材质渲染角色。为此,请选中 Depth 复选框,并将 Depth Test 属性设置为 Greater。
完成这些设置后,Unity 仅在角色位于另一个游戏对象后面时才使用 CharacterBehindObjects
材质渲染角色。但是,Unity 也使用 CharacterBehindObjects
材质渲染角色的某些部分,因为角色的一些部分会遮挡角色本身。
创建额外的渲染器功能以避免自透视效果
由于以下原因,上一节中的设置会导致自透视效果:
在执行 URP 渲染器的不透明渲染通道时,Unity 使用
Character
材质来渲染属于角色的所有游戏对象,并将深度值写入深度缓冲区。这发生在 Unity 开始执行DrawCharacterBehind
渲染器功能之前,因为默认情况下,新的渲染对象渲染器功能在 Event 属性中具有 AfterRenderingOpaques 值。Event 属性定义了 Unity 从渲染对象渲染器功能注入渲染通道的注入点。URP 渲染器在 Opaque Layer Mask 中绘制游戏对象时的事件是 BeforeRenderingOpaques 事件。
在执行
DrawCharacterBehind
渲染器功能时,Unity 使用 Depth Test 属性中指定的条件执行深度测试。在下面的屏幕截图中,较大胶囊体遮挡了较小胶囊体的一部分,并且对于较小胶囊体的这个部分,通过了深度测试。渲染器功能会覆盖这个部分的材质。
以下步骤描述了如何避免此类行为并确保 Unity 使用正确的材质绘制角色的所有部分。
在 URP 资源的 Filtering > Opaque Layer Mask 中,清除
Character
层旁边的复选标记。现在,除非角色位于游戏对象后面,否则 Unity 不会渲染角色。
添加一个新的渲染对象渲染器功能,并将其命名为
Character
。在
Character
渲染器功能的 Filters > Layer Mask 中,选择Character
层。现在,即使角色位于游戏对象后面,Unity 也会使用
Character
材质渲染角色。发生这种情况是因为
DrawCharacterBehind
渲染器功能将值写入深度缓冲区。当 Unity 执行Character
渲染器功能时,角色上的像素看起来位于 Unity 先前绘制的像素之前,并且 Unity 在这些像素之上进行绘制。在
DrawCharacterBehind
渲染器功能的 Overrides > Depth 中,清除 Write Depth 复选框。根据此设置,DrawCharacterBehind
渲染器功能不会更改深度缓冲区,并且Character
渲染器功能在角色位于游戏对象后面时不会绘制角色。
此示例已完成。当角色位于游戏对象后面时,Unity 会使用 CharacterBehindObjects
材质绘制角色的轮廓。
使用额外的 Character
渲染器功能,Unity 按以下方式渲染游戏对象:
URP 渲染器不会在 BeforeRenderingOpaques 事件中渲染
Character
游戏对象,因为Character
层不包括在 Opaque Layer Mask 列表中。DrawCharacterBehind
渲染器功能会绘制角色位于其他游戏对象后面的部分。此行为发生在 AfterRenderingOpaques 事件中。Character
渲染器功能会绘制角色位于其他游戏对象前面的部分。此行为发生在 AfterRenderingOpaques 事件中,以及在执行DrawCharacterBehind
渲染器功能之后。
要查看渲染对象渲染器功能的另一个用例,请参阅通用渲染示例项目中的对象遮挡场景。