Version: 6000.3
语言: 中文
URP 中的运动矢量
URP 中运动向量的内置着色器支持

URP 中的运动矢量简介

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

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

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

URP 仅支持不透明材质(包括 alpha 裁剪材质)的运动矢量。URP 不支持透明材质的运动矢量。

实现细节

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

运动矢量定义

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

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

运动矢量有两类:

  • 摄像机运动矢量:仅由摄像机自身运动引起的运动矢量。

  • 对象运动矢量:由摄像机的运动和碎片所属对象的世界空间运动组合而成的运动矢量。

仅给定运动矢量纹理,无法推断片段在屏幕上的运动是否仅是由于摄像机运动、物体运动或两者的组合。

单个全屏通道足以计算摄像机运动矢量。此类通道具有固定的每帧计算负载,独立于场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您可以放置环境、障碍物和装饰,实质上是分批设计和构建游戏。更多信息
请参阅术语表
复杂性。只需要知道所有像素计算机图像中的最小单位。像素大小取决于您的屏幕分辨率。像素光照是在每个屏幕像素下计算的。更多信息
请参阅术语表
以及相机的移动方式,这可以从深度缓冲区 保存图像中每个像素的 z 值深度的内存存储,其中 z 值是投影平面中每个呈现像素的深度。更多信息
请参阅术语表
以及当前和前一帧的相机矩阵。

对象运动向量具有计算负载,这取决于场景中移动对象的数量和复杂性,因为需要对每个对象进行绘制来考虑每个对象的运动。每次绘制也需要应用摄像机的运动贡献。

Unity 渲染每个对象运动矢量的情况

Unity 为meshUnity 的主要图形原语。网格体构成了 3D 世界的很大一部分。Unity 支持三角或四边形多边形网格。Nurbs、Nurms、Subdiv 曲面必须转换为多边形。更多信息
请参阅术语表
在满足以下三个条件的帧中:

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

  2. 网格体正在通过以下任一渲染器进行渲染:

    1. 蒙皮网格渲染器

    2. MeshRenderer,当其 运动向量(Motion Vectors) 属性未设置为Camera Motion Only.

    3. 使用以下 API:Graphics.RenderMeshGraphics.RenderMeshInstancedGraphics.RenderMeshIndirect,以及MotionVectorMode成员RenderParamsstruct 未设置为Camera.

  3. 如果满足以下任一条件:

    1. MotionVectorGenerationMode属性设置为ForceNoMotionMeshRendererRenderParams.MotionVectorModestruct 的成员Grphics.Render...蜜蜂属。

      注意:ForceNoMotion选项要求每帧渲染一个每个对象的运动矢量通道,以便可以用零覆盖此类对象的摄像机运动矢量。

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

    3. 材质上的 MotionVectors 通道被禁用,但前一帧和当前帧的模型矩阵不匹配,或者对象具有骨架动画。如果没有骨架动画的固定渲染器具有MotionVectors通过,但它在他们的材料上被禁用了。

MotionVectors 在 URP 预构建着色器中传递

当为预生成着色器启用 MotionVectors 通道时,Unity 会为网格渲染器一个网格体组件,它从网格体过滤器中获取几何体,并将其渲染到对象的变换组件定义的位置。更多信息
请参阅术语表
即使他们不动。

当满足以下条件时,Unity 会在预构建的 URP 着色器中启用 MotionVectors 传递:

  • URPShaderLabUnity 用于定义 Shader 对象结构的语言。更多信息
    请参阅术语表
    着色器:在材质上,在 高级选项(Advanced Options) 分段中启用 Alembic 运动矢量(Alembic Motion Vectors) 属性。

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

    • Alembic 运动矢量已启用。
    • 其他运动矢量(Additional Motion Vectors) 属性设置为 TimeBasedCustom
URP 中的运动矢量
URP 中运动向量的内置着色器支持