版本:Unity 6 (6000.0)
语言:英语
URP 中的运动向量
URP 中内置着色器对运动向量的支持

URP 中的运动向量简介

URP 使用运动向量渲染通道来计算表面片段的帧间屏幕空间运动。URP 将运动数据存储在一个全屏纹理中,存储的每个像素值被称为运动向量

仅当帧中存在具有请求运动向量通道的渲染通道的活动功能时,Unity 才会运行运动向量渲染通道。例如,以下 URP 功能会请求运动向量通道:时间抗锯齿运动模糊。有关如何在自定义通道中请求运动向量通道的信息,请参阅部分在通道中使用运动向量纹理

不正确或缺失的运动向量会导致依赖于运动向量的效果出现视觉伪像。按照本页面的说明确保您的对象渲染器、材质和着色器在 GPU 上运行的程序。 更多信息
参见 术语表
设置正确,以支持运动向量。

URP 仅支持不透明材质的运动向量,包括 alpha 剪切材质。URP 不支持透明材质的运动向量。

实现细节

本节介绍 URP 如何实现运动向量。

运动向量定义

运动向量是一个二维向量,表示表面片段相对于相机创建场景中特定视点的图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。 更多信息
参见 术语表
自上一帧以来的运动,投影到相机的近裁剪平面限制相机从其当前位置可见距离的平面。相机的可见范围在远裁剪平面和近裁剪平面之间。参见远裁剪平面和近裁剪平面。 更多信息
参见 术语表
。运动向量纹理使用 2 个通道(R 和 G)。每个纹素存储每个可见表面片段的 UV 偏移量。如果从给定纹素的当前 UV 坐标中减去运动向量,则将获得该纹素在上一帧屏幕上的 UV 坐标。计算出的上一帧 UV 坐标可能超出屏幕边界。

对象运动向量和仅相机运动向量

运动向量有两类

  • 相机运动向量:仅由相机自身运动引起的运动向量。

  • 对象运动向量:由相机运动和片段所属对象的世界空间运动共同引起的运动向量。

仅使用运动向量纹理,无法推断片段在屏幕上的运动是否仅是由于相机运动、对象运动还是两者的组合造成的。

一个全屏通道就足以计算相机运动向量。这种通道具有固定的每帧计算负载,与场景场景包含游戏的环境和菜单。可以将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您放置环境、障碍物和装饰,基本上是分段设计和构建游戏。 更多信息
参见 术语表
复杂度无关。只需要知道屏幕上所有像素计算机图像中最小的单元。像素大小取决于屏幕分辨率。像素灯光在每个屏幕像素处计算。 更多信息
参见 术语表
的当前 3D 位置,以及相机如何移动,这可以从深度缓冲区存储图像中每个像素的 z 值深度的内存存储器,其中 z 值是从投影平面到每个渲染像素的深度。 更多信息
参见 术语表
和当前帧和上一帧的相机矩阵推断出来。

对象运动向量的计算负载取决于场景中移动对象的数量和复杂度,因为需要对每个对象进行一次绘制,以说明每个对象的运动。每次绘制都需要应用相机的运动贡献。

Unity 渲染每个对象运动向量的场合

当满足以下三个条件时,Unity 会为帧中的网格Unity 的主要图形基元。网格构成 3D 世界的很大一部分。Unity 支持三角形或四边形多边形网格。Nurbs、Nurms、Subdiv 表面必须转换为多边形。 更多信息
参见 术语表
渲染对象运动向量

  1. 与网格关联的着色器在活动子着色器块中具有MotionVectors 通道

  2. 网格通过以下任何渲染器进行渲染

    1. SkinnedMeshRenderer.

    2. MeshRenderer,当其 运动向量 属性未设置为 仅相机运动 时。

    3. 使用以下 API:Graphics.RenderMeshGraphics.RenderMeshInstancedGraphics.RenderMeshIndirect,其中 RenderParams 结构的 MotionVectorMode 成员未设置为 Camera

  3. 如果以下任何条件为真

    1. MotionVectorGenerationMode 属性在 MeshRendererGrphics.Render... API 的 RenderParams.MotionVectorMode 结构成员上设置为 ForceNoMotion

      注意:ForceNoMotion 选项需要每帧渲染每个对象的运动向量通道,以便使用零覆盖此类对象的相机运动向量。

    2. MotionVectors 通道在材质上启用(例如,当材质在着色器图形或 alembic 动画中具有顶点动画时)。

    3. MotionVectors 通道在材质上禁用,但上一帧和当前帧的模型矩阵不匹配,或者对象具有骨骼动画。如果没有骨骼动画的静止渲染器,如果其着色器具有 MotionVectors 通道,但该通道在其材质上禁用,则不会使用对象运动向量通道进行渲染。

URP 预制着色器中的 MotionVectors 通道

当为预制着色器启用 MotionVectors 通道时,即使网格渲染器从网格过滤器获取几何体并将其渲染在由对象的变换组件定义的位置的网格组件。 更多信息
参见 术语表
没有移动,Unity 也会为其渲染对象运动向量。

当满足以下条件时,Unity 会在预制的 URP 着色器中启用 MotionVectors 通道

  • URP ShaderLabUnity 的语言,用于定义着色器对象的结构。 更多信息
    参见 术语表
    着色器:在材质上,Alembic 运动向量 属性在 高级选项 部分启用。

  • URP Lit 和 Unlit 着色器图形着色器:在 图形检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑这些值。 更多信息
    参见 术语表
    中,任何以下属性都已设置

    • Alembic 运动向量 已启用。
    • 附加运动向量 属性设置为 基于时间自定义
URP 中的运动向量
URP 中内置着色器对运动向量的支持