版本:Unity 6 (6000.0)
语言:英语
将渲染器特性添加到 URP 渲染器
URP 渲染对象渲染器特性的参考

URP 中通过渲染对象渲染器特性创建自定义渲染效果的示例

URP 在 **DrawOpaqueObjects** 和 **DrawTransparentObjects** 通道中绘制物体。您可能需要在帧渲染过程中的不同点绘制物体,或者以其他方式解释和写入渲染数据(如深度和模板)。渲染对象渲染器特性 允许您通过在特定层级、特定时间、使用特定覆盖方式绘制物体来进行此类定制。

本页面的示例描述了如何使用渲染对象渲染器特性创建自定义渲染效果。

示例概述

本页面的示例演示了如何实现以下效果

  • 场景中有一个角色。场景场景包含游戏的环境和菜单。将每个独特的场景文件视为一个独特的游戏关卡。在每个场景中,您放置环境、障碍物和装饰,本质上是设计和构建游戏的各个部分。更多信息
    参见 术语表
    .

    Character
    角色
  • 当角色走到 游戏物体Unity 场景中的基本物体,可以代表角色、道具、场景、摄像机、路径点等。游戏物体的功能由附加到它的组件定义。更多信息
    参见 术语表
    后面时,Unity 会使用不同的材质绘制角色轮廓。

    Character goes behind GameObjects
    角色走到游戏物体后面

先决条件

本示例需要以下内容

  • 安装了 URP 包的 Unity 项目。

  • 可编程渲染管线设置 属性指的是 URP 资源(项目设置 > 图形 > 可编程渲染管线设置)。

创建示例场景和游戏物体

要按照本示例中的步骤操作,请创建一个包含以下游戏物体的新场景

  1. 创建一个立方体。设置其缩放值,使其看起来像一堵墙。

    Cube that represents a wall
    代表墙壁的立方体
  2. 创建一个材质并为其分配 Universal Render Pipeline/Lit 着色器在 GPU 上运行的程序。更多信息
    参见 术语表
    。选择基本颜色(例如,红色)。将材质命名为 Character

  3. 创建一个基本角色并为其分配 Character 材质。在本示例中,角色由三个胶囊组成:中间的大胶囊代表身体,两个较小的胶囊代表手。

    The character consisting of three capsules
    由三个胶囊组成的角色

    为了便于在场景中操纵角色,将三个胶囊作为子游戏物体添加到 Character 游戏物体下。

    Character objects in Hierarchy
    层次结构中的角色物体
  4. 创建一个材质并为其分配 Universal Render Pipeline/Unlit 着色器。选择您希望角色在游戏物体后面时具有的基本颜色(例如,蓝色)。将材质命名为 CharacterBehindObjects

现在您已经具备了按照本示例中的步骤操作所需的设置。

示例实现

本节假定您已创建了如 示例场景和游戏物体 一节中所述的场景。

示例实现使用两个渲染对象渲染器特性:一个用于绘制角色在其他游戏物体后面的部分,另一个用于绘制角色在其他游戏物体前面的部分。

创建渲染器特性以绘制角色在游戏物体后面

请按照以下步骤创建渲染器特性以绘制角色在游戏物体后面。

  1. 选择一个 URP 渲染器。

    Select a URP Renderer
    选择一个 URP 渲染器
  2. 检查器一个 Unity 窗口,显示有关当前所选游戏物体、资源或项目设置的信息,允许您检查和编辑值。更多信息
    参见 术语表
    中,单击添加渲染器特性并选择渲染对象

    Add Render Object Renderer Feature
    添加渲染对象渲染器特性

    选择名称字段并输入新渲染器特性的名称,例如,DrawCharacterBehind

  3. 本示例使用层级来过滤要渲染的游戏物体。创建一个新层级并将其命名为角色

    Create new Layer called Character
    创建名为角色的新层级
  4. 选择角色游戏物体并将其分配给 角色 层级。为此,请打开层级下拉菜单并选择 角色将角色游戏物体分配给角色层级

  5. DrawCharacterBehind 渲染器特性中,在过滤器 > 层级遮罩中,选择 角色。使用此设置,此渲染器特性仅渲染 角色 层级中的游戏物体。

  6. 覆盖 > 材质中,选择 CharacterBehindObjects 材质。

    渲染器特性使用所选材质覆盖游戏物体的材质。

    Layer Mask, Material Override
    层级遮罩,材质覆盖
  7. 预期行为是渲染器特性仅在角色位于其他游戏物体后面时使用 CharacterBehindObjects 材质渲染角色。

    为了实现此目的,请选中深度复选框,并将深度测试属性设置为大于

    Set Depth Test to Greater
    将深度测试设置为大于

使用这些设置,Unity 仅在角色位于另一个游戏物体后面时才使用 CharacterBehindObjects 材质渲染角色。但是,Unity 还会使用 CharacterBehindObjects 材质渲染角色的某些部分,因为角色的某些部分会遮挡角色本身。

Unity renders parts of the character using the CharacterBehindObjects Material
Unity 使用 CharacterBehindObjects 材质渲染角色的某些部分

创建额外的渲染器特性以避免自我穿透效果

上一节中的设置导致自我穿透效果的原因如下

  • 在执行 URP 渲染器的 Opaque 渲染通道时,Unity 会使用 Character 材质渲染属于角色的所有游戏物体并将深度值写入 深度缓冲区一个内存存储,它保存图像中每个像素的 z 值深度,其中 z 值是从投影平面到每个渲染像素的深度。更多信息
    参见 术语表
    。这发生在 Unity 开始执行 DrawCharacterBehind 渲染器特性之前,因为默认情况下,新的渲染对象渲染器特性在事件属性中具有值AfterRenderingOpaques

    事件属性定义 Unity 从渲染对象渲染器特性注入渲染通道的注入点。URP 渲染器在Opaque 层级遮罩一个值,定义要包含在操作中或从操作中排除的层级,例如渲染、碰撞或您自己的代码。更多信息
    参见 术语表
    中绘制游戏物体的事件是BeforeRenderingOpaques 事件。

  • 在执行 DrawCharacterBehind 渲染器特性时,Unity 使用深度测试属性中指定的条件执行深度测试。在下图中,较大的胶囊遮挡了较小胶囊的一部分,并且深度测试通过了较小胶囊的那一部分。渲染器特性会为该部分覆盖材质。

    Self see-through effect
    自我穿透效果

以下步骤描述了如何避免此类行为并确保 Unity 使用适当的材质绘制角色的所有部分。

  1. 在 URP 资源中,在过滤 > Opaque 层级遮罩中,清除 角色 层级旁边的复选标记。

    Clear the check mark next to the Character Layer
    清除 角色 层级旁边的复选标记

    现在,除非角色位于游戏物体后面,否则 Unity 不会渲染角色。

    Unity does not render the character unless its behind an object
    除非角色位于物体后面,否则 Unity 不会渲染角色
  2. 添加一个新的渲染对象渲染器特性,并将其命名为 Character

  3. Character 渲染器特性中,在过滤器 > 层级遮罩中,选择 角色 层级。

    Set Layer Mask Filter to Character Layer
    将层级遮罩过滤器设置为角色层级

    现在,即使角色位于游戏物体后面,Unity 也会使用 Character 材质渲染角色。

    这是因为 DrawCharacterBehind 渲染器特性将值写入深度缓冲区。当 Unity 执行 Character 渲染器特性时,角色上的 像素计算机图像中的最小单位。像素大小取决于屏幕分辨率。像素照明在每个屏幕像素处计算。更多信息
    参见 术语表
    似乎位于 Unity 之前绘制的像素前面,并且 Unity 会在这些像素的顶部进行绘制。

  4. DrawCharacterBehind 渲染器特性中,在覆盖 > 深度中,清除写入深度复选框。使用此设置,DrawCharacterBehind 渲染器特性不会对深度缓冲区进行更改,并且 Character 渲染器特性不会在角色位于游戏物体后面时绘制角色。

    Clear Write Depth
    清除写入深度

示例已完成。当角色走到游戏物体后面时,Unity 会使用 CharacterBehindObjects 材质绘制角色轮廓。

Character goes behind objects
角色走到物体后面

使用额外的 Character 渲染器特性,Unity 会按以下方式渲染游戏物体

  1. URP 渲染器不会在BeforeRenderingOpaques 事件中渲染 Character 游戏物体,因为 角色 层级已从Opaque 层级遮罩列表中排除。

  2. DrawCharacterBehind 渲染器特性会绘制角色在其他游戏物体后面的部分。这发生在AfterRenderingOpaques 事件中。

  3. Character 渲染器特性会绘制角色在其他游戏物体前面的部分。这发生在AfterRenderingOpaques 事件中,并且在执行 DrawCharacterBehind 渲染器特性之后。

将渲染器特性添加到 URP 渲染器
URP 渲染对象渲染器特性的参考