URP 使用运动向量渲染通道来计算表面片段的帧间屏幕空间运动。URP 将运动数据存储在一个全屏纹理中,存储的每个像素值被称为运动向量。
仅当帧中存在具有请求运动向量通道的渲染通道的活动功能时,Unity 才会运行运动向量渲染通道。例如,以下 URP 功能会请求运动向量通道:时间抗锯齿 和 运动模糊。有关如何在自定义通道中请求运动向量通道的信息,请参阅部分在通道中使用运动向量纹理。
不正确或缺失的运动向量会导致依赖于运动向量的效果出现视觉伪像。按照本页面的说明确保您的对象渲染器、材质和着色器在 GPU 上运行的程序。 更多信息
参见 术语表设置正确,以支持运动向量。
URP 仅支持不透明材质的运动向量,包括 alpha 剪切材质。URP 不支持透明材质的运动向量。
本节介绍 URP 如何实现运动向量。
运动向量是一个二维向量,表示表面片段相对于相机创建场景中特定视点的图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。 更多信息
参见 术语表自上一帧以来的运动,投影到相机的近裁剪平面限制相机从其当前位置可见距离的平面。相机的可见范围在远裁剪平面和近裁剪平面之间。参见远裁剪平面和近裁剪平面。 更多信息
参见 术语表。运动向量纹理使用 2 个通道(R 和 G)。每个纹素存储每个可见表面片段的 UV 偏移量。如果从给定纹素的当前 UV 坐标中减去运动向量,则将获得该纹素在上一帧屏幕上的 UV 坐标。计算出的上一帧 UV 坐标可能超出屏幕边界。
运动向量有两类
相机运动向量:仅由相机自身运动引起的运动向量。
对象运动向量:由相机运动和片段所属对象的世界空间运动共同引起的运动向量。
仅使用运动向量纹理,无法推断片段在屏幕上的运动是否仅是由于相机运动、对象运动还是两者的组合造成的。
一个全屏通道就足以计算相机运动向量。这种通道具有固定的每帧计算负载,与场景场景包含游戏的环境和菜单。可以将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您放置环境、障碍物和装饰,基本上是分段设计和构建游戏。 更多信息
参见 术语表复杂度无关。只需要知道屏幕上所有像素计算机图像中最小的单元。像素大小取决于屏幕分辨率。像素灯光在每个屏幕像素处计算。 更多信息
参见 术语表的当前 3D 位置,以及相机如何移动,这可以从深度缓冲区存储图像中每个像素的 z 值深度的内存存储器,其中 z 值是从投影平面到每个渲染像素的深度。 更多信息
参见 术语表和当前帧和上一帧的相机矩阵推断出来。
对象运动向量的计算负载取决于场景中移动对象的数量和复杂度,因为需要对每个对象进行一次绘制,以说明每个对象的运动。每次绘制都需要应用相机的运动贡献。
当满足以下三个条件时,Unity 会为帧中的网格Unity 的主要图形基元。网格构成 3D 世界的很大一部分。Unity 支持三角形或四边形多边形网格。Nurbs、Nurms、Subdiv 表面必须转换为多边形。 更多信息
参见 术语表渲染对象运动向量
与网格关联的着色器在活动子着色器块中具有MotionVectors 通道。
网格通过以下任何渲染器进行渲染
SkinnedMeshRenderer.
MeshRenderer,当其 运动向量 属性未设置为 仅相机运动
时。
使用以下 API:Graphics.RenderMesh、Graphics.RenderMeshInstanced 或 Graphics.RenderMeshIndirect,其中 RenderParams
结构的 MotionVectorMode
成员未设置为 Camera
。
如果以下任何条件为真
MotionVectorGenerationMode
属性在 MeshRenderer
或 Grphics.Render...
API 的 RenderParams.MotionVectorMode
结构成员上设置为 ForceNoMotion
。
注意:ForceNoMotion
选项需要每帧渲染每个对象的运动向量通道,以便使用零覆盖此类对象的相机运动向量。
MotionVectors 通道在材质上启用(例如,当材质在着色器图形或 alembic 动画中具有顶点动画时)。
MotionVectors 通道在材质上禁用,但上一帧和当前帧的模型矩阵不匹配,或者对象具有骨骼动画。如果没有骨骼动画的静止渲染器,如果其着色器具有 MotionVectors
通道,但该通道在其材质上禁用,则不会使用对象运动向量通道进行渲染。
当为预制着色器启用 MotionVectors 通道时,即使网格渲染器从网格过滤器获取几何体并将其渲染在由对象的变换组件定义的位置的网格组件。 更多信息
参见 术语表没有移动,Unity 也会为其渲染对象运动向量。
当满足以下条件时,Unity 会在预制的 URP 着色器中启用 MotionVectors 通道