URP 在 **DrawOpaqueObjects** 和 **DrawTransparentObjects** 通道中绘制物体。您可能需要在帧渲染过程中的不同点绘制物体,或者以其他方式解释和写入渲染数据(如深度和模板)。渲染对象渲染器特性 允许您通过在特定层级、特定时间、使用特定覆盖方式绘制物体来进行此类定制。
本页面的示例描述了如何使用渲染对象渲染器特性创建自定义渲染效果。
本页面的示例演示了如何实现以下效果
场景中有一个角色。场景场景包含游戏的环境和菜单。将每个独特的场景文件视为一个独特的游戏关卡。在每个场景中,您放置环境、障碍物和装饰,本质上是设计和构建游戏的各个部分。更多信息
参见 术语表.
当角色走到 游戏物体Unity 场景中的基本物体,可以代表角色、道具、场景、摄像机、路径点等。游戏物体的功能由附加到它的组件定义。更多信息
参见 术语表 后面时,Unity 会使用不同的材质绘制角色轮廓。
本示例需要以下内容
安装了 URP 包的 Unity 项目。
可编程渲染管线设置 属性指的是 URP 资源(项目设置 > 图形 > 可编程渲染管线设置)。
要按照本示例中的步骤操作,请创建一个包含以下游戏物体的新场景
创建一个立方体。设置其缩放值,使其看起来像一堵墙。
创建一个材质并为其分配 Universal Render Pipeline/Lit
着色器在 GPU 上运行的程序。更多信息
参见 术语表。选择基本颜色(例如,红色)。将材质命名为 Character
。
创建一个基本角色并为其分配 Character 材质。在本示例中,角色由三个胶囊组成:中间的大胶囊代表身体,两个较小的胶囊代表手。
为了便于在场景中操纵角色,将三个胶囊作为子游戏物体添加到 Character 游戏物体下。
创建一个材质并为其分配 Universal Render Pipeline/Unlit
着色器。选择您希望角色在游戏物体后面时具有的基本颜色(例如,蓝色)。将材质命名为 CharacterBehindObjects
。
现在您已经具备了按照本示例中的步骤操作所需的设置。
本节假定您已创建了如 示例场景和游戏物体 一节中所述的场景。
示例实现使用两个渲染对象渲染器特性:一个用于绘制角色在其他游戏物体后面的部分,另一个用于绘制角色在其他游戏物体前面的部分。
请按照以下步骤创建渲染器特性以绘制角色在游戏物体后面。
选择一个 URP 渲染器。
在 检查器一个 Unity 窗口,显示有关当前所选游戏物体、资源或项目设置的信息,允许您检查和编辑值。更多信息
参见 术语表 中,单击添加渲染器特性并选择渲染对象。
选择名称字段并输入新渲染器特性的名称,例如,DrawCharacterBehind。
本示例使用层级来过滤要渲染的游戏物体。创建一个新层级并将其命名为角色。
选择角色游戏物体并将其分配给 角色
层级。为此,请打开层级下拉菜单并选择 角色
。
在 DrawCharacterBehind
渲染器特性中,在过滤器 > 层级遮罩中,选择 角色
。使用此设置,此渲染器特性仅渲染 角色
层级中的游戏物体。
在覆盖 > 材质中,选择 CharacterBehindObjects
材质。
渲染器特性使用所选材质覆盖游戏物体的材质。
预期行为是渲染器特性仅在角色位于其他游戏物体后面时使用 CharacterBehindObjects
材质渲染角色。
为了实现此目的,请选中深度复选框,并将深度测试属性设置为大于。
使用这些设置,Unity 仅在角色位于另一个游戏物体后面时才使用 CharacterBehindObjects
材质渲染角色。但是,Unity 还会使用 CharacterBehindObjects
材质渲染角色的某些部分,因为角色的某些部分会遮挡角色本身。
上一节中的设置导致自我穿透效果的原因如下
在执行 URP 渲染器的 Opaque 渲染通道时,Unity 会使用 Character
材质渲染属于角色的所有游戏物体并将深度值写入 深度缓冲区一个内存存储,它保存图像中每个像素的 z 值深度,其中 z 值是从投影平面到每个渲染像素的深度。更多信息
参见 术语表。这发生在 Unity 开始执行 DrawCharacterBehind
渲染器特性之前,因为默认情况下,新的渲染对象渲染器特性在事件属性中具有值AfterRenderingOpaques。
事件属性定义 Unity 从渲染对象渲染器特性注入渲染通道的注入点。URP 渲染器在Opaque 层级遮罩一个值,定义要包含在操作中或从操作中排除的层级,例如渲染、碰撞或您自己的代码。更多信息
参见 术语表 中绘制游戏物体的事件是BeforeRenderingOpaques 事件。
在执行 DrawCharacterBehind
渲染器特性时,Unity 使用深度测试属性中指定的条件执行深度测试。在下图中,较大的胶囊遮挡了较小胶囊的一部分,并且深度测试通过了较小胶囊的那一部分。渲染器特性会为该部分覆盖材质。
以下步骤描述了如何避免此类行为并确保 Unity 使用适当的材质绘制角色的所有部分。
在 URP 资源中,在过滤 > Opaque 层级遮罩中,清除 角色
层级旁边的复选标记。
现在,除非角色位于游戏物体后面,否则 Unity 不会渲染角色。
添加一个新的渲染对象渲染器特性,并将其命名为 Character
。
在 Character
渲染器特性中,在过滤器 > 层级遮罩中,选择 角色
层级。
现在,即使角色位于游戏物体后面,Unity 也会使用 Character
材质渲染角色。
这是因为 DrawCharacterBehind
渲染器特性将值写入深度缓冲区。当 Unity 执行 Character
渲染器特性时,角色上的 像素计算机图像中的最小单位。像素大小取决于屏幕分辨率。像素照明在每个屏幕像素处计算。更多信息
参见 术语表 似乎位于 Unity 之前绘制的像素前面,并且 Unity 会在这些像素的顶部进行绘制。
在 DrawCharacterBehind
渲染器特性中,在覆盖 > 深度中,清除写入深度复选框。使用此设置,DrawCharacterBehind
渲染器特性不会对深度缓冲区进行更改,并且 Character
渲染器特性不会在角色位于游戏物体后面时绘制角色。
示例已完成。当角色走到游戏物体后面时,Unity 会使用 CharacterBehindObjects
材质绘制角色轮廓。
使用额外的 Character
渲染器特性,Unity 会按以下方式渲染游戏物体
URP 渲染器不会在BeforeRenderingOpaques 事件中渲染 Character
游戏物体,因为 角色
层级已从Opaque 层级遮罩列表中排除。
DrawCharacterBehind
渲染器特性会绘制角色在其他游戏物体后面的部分。这发生在AfterRenderingOpaques 事件中。
Character
渲染器特性会绘制角色在其他游戏物体前面的部分。这发生在AfterRenderingOpaques 事件中,并且在执行 DrawCharacterBehind
渲染器特性之后。