影片渲染队列支持在不同的通道中渲染不同类型的输出图像,例如最终图像、对象ID和其他与渲染相关的通道。每个渲染通道设置将以单独的渲染模式输出你的影片。然后,你可以在所选的外部后期制片或复合程序中使用它们。
先决条件
- 你已完成 影片渲染队列(Movie Render Queue) 页面中的先决条件步骤。
-
如果你要使用 对象ID(Object ID’s),必须启用插件才能使用。在虚幻引擎菜单中前往 编辑(Edit)> 插件(Plugins),在 渲染(Rendering) 分段中找到 影片渲染队列额外渲染通道(Movie Render Queue Additional Render Passes),然后将其启用。稍后你需要重启编辑器。
尽管影片渲染队列能够输出 一些 渲染通道,但由于延迟渲染的局限性,无法输出要从中组合最终图像的所有通道。这意味着,其他渲染包(AOV)中提供的常见通道(如环境光遮蔽或子表面散射)在虚幻引擎中不可用。此页面仅列出支持的通道。
概述
你可以点击 + 设置(+ Setting) 按钮,然后选择 渲染(Rendering) 类别中的条目,将 渲染通道(Render Passes) 添加到你的输出。

你可以像对其他设置那样启用和禁用渲染通道,并且可以将其选中以编辑其属性(如果可用)。
默认情况下,所有选定渲染通道都将在最终输出文件夹中一起输出。你可以利用格式字符串标记 {render_pass} 帮助整理你的通道。例如,在 文件名格式(File Name Format) 中设置以下内容,将导致通道分为相对于 输出目录(Output Directory) 的通道相关子文件夹:
{render_pass}/{sequence_name}.{frame_number}




影片渲染队列可以生成的一些渲染通道示例。
延迟渲染
虚幻的主输出由默认的 延迟渲染(Deferred Rendering) 设置处理,这会生成你在视口中看到的最终图像。其中提供了一些变体,包括 细节光照(Detail Lighting)、仅光照(Lighting Only)、反射(Reflections) 和 无光照(Unlit)。这些变体不用于创建最终图像,在这里提供是为了与关卡编辑器视口对等。
“延迟渲染”选项包括以下各项:
渲染通道 | 说明 |
---|---|
延迟渲染(Deferred Rendering) | 显示场景的最终图像,匹配你在视口中看到的内容。 ![]() |
细节光照(Detail Lighting) | 一种特殊的着色器变体,仅显示与法线贴图结合的光照。有助于展示场景的几何体。 ![]() |
仅光照(Lighting Only) | 与细节光照相似,但没有影响光照的法线贴图。 ![]() |
仅反射(Reflections Only) | 一种特殊的着色器变体,使世界中的一切都反射光。 ![]() |
无光照(Unlit) | 一种特殊的着色器变体,仅显示基础颜色,无光照信息。 ![]() |
所有延迟渲染通道都包含相同的属性,但每个渲染通道可以单独配置。

名称 | 说明 |
---|---|
累加器包括Alpha(Accumulator Includes Alpha) | 如果启用此项,多个时间/空间示例将对alpha通道累积。这需要将r.PostProcessing.PropagateAlpha设置为1或2,要将其启用,你可以转到“项目设置(Project Settings)”>“渲染(Rendering)”,并使用“在后期处理中启用Alpha通道支持(Enable Alpha Channel Support in Post Processing)”设置。 这还会使累积成本增加大约30%,因此你应该避免在不必要的情况下使用此项。这应用于使用多个时间或空间示例的渲染。 |
禁用多重采样效果(Disable Multisample Effects) | 禁用将多个像素混合在一起的后期处理效果,如景深、时间抗锯齿、动态模糊和色差,这些效果在使用对象ID渲染通道时不适合。你可以利用此设置为渲染作业排除这些后期处理,而不必在你的场景中手动禁用。 |
使用32位后期处理材质(Use 32Bit Post Process Materials) | 启用此项将导致后期处理材质写入32位质量,而不是16位。 |
额外后期处理材质(Additional Post Process Materials) | 要包括的一系列额外的后期处理渲染通道。默认情况下包括MovieRenderQueue_WorldDepth和MovieRenderQueue_MotionVectors。必须启用该材质,通道才能渲染。 |
添加默认层(Add Default Layer) | 创建额外模板层,其中包含“模板层(Stencil Layers)”数组中尚未包含的所有对象。此默认层将单独渲染,这样你就可以在创建的渲染中排除较小的对象组,以后再重新复合。 |
模板层(Stencil Layers) | 模板层列表,其中包含场景中成组的对象。场景将使用所有对象重新渲染,接着,不包含指定层上对象的像素将被裁剪并变为黑色。然后将应用后期处理,其中保留使用DoF、动态模糊和TAA的能力。 |
后期处理渲染通道
后期处理渲染通道是你可以从延迟渲染器指定的额外渲染通道。你必须以.exr格式输出,因为其中有颜色和元数据信息无法通过其他格式显示和解译。
世界深度
世界深度(World Depth) 是以红色通道中存储的世界单位写入的深度。这可用于在后期制片中重新创建 景深(Depth of Field)。摄像机焦距和快门大小可以从EXR元数据中读取,以自动匹配游戏内的景深。

Nuke ZDefocus2 节点的示例可在下面找到。这将从EXR文件读取元数据,并生成类似于实时情况的模糊。你必须在粘贴后重新调整focal_point属性,这样就能正确对WorldDepth纹理取样。
ZDefocus Nuke节点的世界深度
set cut_paste_input [stack 0]
version 12.0 v3
push $cut_paste_input
add_layer {FinalImageMovieRenderQueue_WorldDepth FinalImageMovieRenderQueue_WorldDepth.red FinalImageMovieRenderQueue_WorldDepth.green FinalImageMovieRenderQueue_WorldDepth.blue FinalImageMovieRenderQueue_WorldDepth.alpha}
ZDefocus2 {
z_channel FinalImageMovieRenderQueue_WorldDepth.red
math depth
fill_foreground false
center {{"[metadata exr/unreal/camera/FinalImage/focalDistance]"}}
focal_point {960 540}
size {{"((input.height*(focalLength*focalLength / (fstop * (focalDistance - focalLength)))*.5 / sensorWidth)/10)" x1 26}}
max_size 100
filter_type bladed
legacy_resize_mode false
show_legacy_resize_mode false
blades {{"[metadata exr/unreal/camera/FinalImage/dofDiaphragmBladeCount]"}}
name ZDefocus1
selected true
xpos 959
ypos 229
addUserKnob {20 User}
addUserKnob {7 focalLength l "Focal Length"}
focalLength {{"[metadata exr/unreal/camera/FinalImage/focalLength]"}}
addUserKnob {7 focalDistance l "Focal Distance"}
focalDistance {{"[metadata exr/unreal/camera/FinalImage/focalDistance]"}}
addUserKnob {7 sensorWidth l "Sensor Width"}
sensorWidth {{"[metadata exr/unreal/camera/FinalImage/sensorWidth]"}}
addUserKnob {7 fstop l Fstop}
fstop {{"[metadata exr/unreal/camera/FinalImage/fstop]"}}
}
运动向量
运动向量(Motion Vectors) 存储在X和Y的 0,1 坐标空间中,而 0.5, 0.5 表示无运动。

在Nuke中,VectorBlur 节点可用于将运动向量应用于你的图像。虚幻会存储规格化到整个屏幕的运动向量,这可能不同于其他渲染包。因此,在Nuke VectorBlur节点中,uv_offset设置为-0.5(以重新调整为/[-.5, .5/]而不是/[0, 1/]),并且运动模糊比例由图像的宽度驱动。
VectorBlur Nuke节点的运动向量
set cut_paste_input [stack 0]
version 12.0 v3
push $cut_paste_input
add_layer {FinalImageMovieRenderQueue_MotionVectors FinalImageMovieRenderQueue_MotionVectors.red FinalImageMovieRenderQueue_MotionVectors.green FinalImageMovieRenderQueue_MotionVectors.blue FinalImageMovieRenderQueue_MotionVectors.alpha}
VectorBlur2 {
uv FinalImageMovieRenderQueue_MotionVectors
uv_offset -0.5
blur_type uniform
scale {{input.width}}
soft_lines true
name Unreal_VectorBlur
selected true
xpos 1338
ypos -93
}
根据你所选的软件,你可能需要独立地重新调整运动向量的X和Y通道,因为其他软件可能要求它们为像素值,而不是规格化到屏幕。X和Y通道在规格化到屏幕后,具有不同的强度。
模板层
模板层允许基于 层(Layers) 中的对象对你的序列进行分层渲染。
系统将为每个层渲染整个场景,并且属于一个层的Actor会渲染到 模板缓冲区(Stencil Buffer) 中。然后,模板缓冲区用于裁剪位于层内Actor之外的像素。这样就让投射阴影的对象将阴影投射到其他Actor和层。
渲染到模板缓冲区后,将应用后期处理效果,获取每个像素并将半透明的黑色写入该像素。这是在半透明之后、后期处理之前发生的,接着后期处理将应用于此层。你可以保留alpha通道,这样你就可以在后期制片中知道实际影响哪些像素,影响程度如何。
下面是三个模板层以及默认层的示例。你可以看到,景深等后期处理效果已正确应用,并且前景中的对象也已从背景图像中裁剪掉。这些图像可以一起添加回来,创建类似于最终渲染的结果,不过这可能需要取消数据预乘。

下面是Nuke中的示例,它将简单的色调移位应用于原始图像中指定的某个层。渲染原始图像时,在“颜色输出(Color Output)”设置中启用了alpha通道累积并禁用了“色调曲线(Tone Curve)”。

要像这样正确重新组合多个图像,图像应该在线性空间中导出(在“颜色输出(Color Output)”设置中禁用“色调曲线(Tone Curve)”)。你应该使用基于OCIO的工作流程来完成这种后期制片工作。
模板层并不是真正的层系统,因为半透明对象会在其后面显示其他层中的不透明对象,并且背景层会在前景对象遮挡它们的地方显示黑洞。 模板层不支持逐层后期处理材质,因为它们将匹配基础层的额外后期处理材质,并且仅与支持 自定义深度/模板(Custom Depth/Stencil) 的材质兼容。
路径追踪器
路径追踪器基于 路径追踪器 渲染方法输出图像。它具有类似于延迟渲染通道的细节。

路径追踪器渲染模式会针对渲染的每一帧累积路径数据。这会导致图像嘈杂,因为会填充图像的像素,尤其是在摄像机帧的内容发生显著变化的情况下。
要减少这种噪点,你可以在 抗锯齿(Anti-Aliasing) 设置中增加 空间示例(Spatial Samples) 的数量。

这将渲染该图像多次,并且额外示例使路径追踪器能够更有效地填充缺口。需要大量 空间示例(Spatial Samples),才能有效去除路径追踪器渲染的噪点,并且这会大幅增加输出图像所需的时间。






增加“空间示例抗锯齿(Spatial Samples Anti-Aliasing)”属性将减少路径追踪器渲染中的噪点。
路径追踪器渲染模式当前是试验性的,目前并非所有材质着色模式都受支持。
对象ID
对象ID(Object Ids) 渲染通道会输出一个图像,其中场景中的每个Actor都会获得一个ID。这些ID可能针对每个Actor完全唯一,或者基于特定属性分组。

你可以在后期制片套件中使用此图像,选择场景中的个别对象并为其创建遮罩,这样你就可以选择性地向特定对象应用调整。


设置
对象ID通道需要满足特定要求,才能正确渲染:
-
为你打算与对象ID通道一起复合的渲染通道启用 禁用多重采样效果(Disable Multisample Effects)。这将排除动态模糊、景深、抗锯齿和其他会混合多层像素的后期处理,确保所有对象都保持轮廓鲜明的边缘。只有这样做,对象ID通道才会与最终图像吻合。
-
在 延迟渲染器(Deferred Renderer) 设置下,展开 额外后期处理材质(Additional Post Process Materials),然后启用 MovieRenderQueue_WorldDepth 和 MovieRenderQueue_MotionVectors 材质。
-
确保你的 屏幕百分比(Screen Percentage) 在序列中的所有 电影摄像机Actor 上都设置为 100。只有这样做,对象ID通道才会与最终图像吻合。
-
将 抗锯齿(Anti-aliasing) 设置添加到你的作业,并将 空间示例数量(Spatial Sample Count) 设置为至少 8。还要启用 覆盖抗锯齿(Override Anti Aliasing) 并将 抗锯齿方法(Anti Aliasing Method) 设置为 无(None)。
这样你就可以克服不支持TAA的局限性。使用 时间示例数量(Temporal Sample Count) 不太可能生成所需的结果,因为缺少动态模糊来覆盖每个示例之间的缺口;你最终会得到淡淡地相互叠加的多个对象副本。
-
将 .exr序列(.exr Sequence) 输出模式添加到你的设置,并激活或删除其他导出格式。确保 多层(Multilayer) 属性已 启用。
实施这些设置后,启动影片渲染队列时,它将输出一个多层EXR,其中包括最终图像、对象ID、世界深度和运动向量。
对象ID使用 Cryptomatte 规格存储在EXR文件中,并且读取此数据的插件可用于第三方软件。
对象ID渲染通道在虚幻引擎中是试验性的。只在虚幻编辑器中可用,不能用于发行版本。
对象ID分组
默认情况下,唯一颜色或ID会分配给关卡中的每个Actor或组件。你可以在 对象ID(Object Ids) ID类型(Id Type) 属性上更改。

ID类型 | 说明 |
---|---|
完整(Full) | 默认行为。将为应用于关卡中所有Actor上的每个图元的每种材质创建唯一ID。 |
材质(Material) | 各个ID将基于其材质或材质实例分组。材质实例将与其父材质分成一组。 |
Actor | 各个ID将按相同Actor实例分组。 |
带有层级的Actor(Actor With Hierarchy) | 各个ID将按相同Actor实例分组。不同 世界大纲视图 文件夹中的Actor将相对于这些文件夹单独分组。 |
文件夹(Folder) | 各个ID将按 世界大纲视图 文件夹中的Actor分组。这些文件夹中的所有Actor将合并为一个ID。 |
层(Layer) | 各个ID将按 层(Layer) 中分配的Actor分组。若Actor属于多个层,可能导致不可靠的结果。 |
在后期组合对象ID、深度和速度
组合多个空间示例、深度和速度,你就可以生成类似于虚幻的后期处理管线的结果;通过深度贴图组合 景深(Depth of Field),通过速度纹理组合 动态模糊(Motion Blur)。可以使用对象ID选取对象和颜色,并进行校正,然后再应用这些后期处理通道。
要通过景深和动态模糊保留正确的明亮高光,渲染场景时应禁用色调曲线。具体做法是,添加“颜色输出(Color Output)”项目,并启用 禁用色调曲线(Disable Tone Curve) 属性。这将在sRGB颜色空间中输出HDR线性值。应用景深和动态模糊之后,你现在可以将其转换为所需的颜色空间(从线性sRGB)。

你还必须在项目设置中启用 基础通道期间输出速度(Output Velocities During Base Pass)。具体做法是,在虚幻引擎主菜单中前往 编辑(Edit)> 项目设置(Project Settings),然后启用……更改此项目设置之后必须重启编辑器。

此外,r.BasePassForceOutputsVelocity
变量必须设置为1。你还可以编辑/Engine/Config/ConsoleVariables.ini以在引擎范围内进行设置,也可以在渲染期间将其应用为 控制台变量(Console Variable)。

下面是使用ZDefocus和VectorBlur节点的示例Nuke图表。要在Nuke中使用速度纹理,其红色和绿色通道需要交换\(下面图表中的RG_TO_GR,使用ShuffleCopy节点\)。
此Nuke图表采用以8个空间示例、对象ID通道、运动向量和世界深度渲染的exr。景深信息会自动从exr元数据中提取。Cryptomatte节点用于创建Newton's Cradle设备的遮罩,然后用作简单色调移位的遮罩。应用色调移位之后,将应用之前提到的ZDefocus节点,然后是VectorBlur。

ObjectID、ZDefocus和VectorBlur Nuke节点
set N56cf6800 [stack 0]
add_layer {ActorHitProxyMask00 ActorHitProxyMask00.red ActorHitProxyMask00.green ActorHitProxyMask00.blue ActorHitProxyMask00.alpha}
add_layer {ActorHitProxyMask01 ActorHitProxyMask01.red ActorHitProxyMask01.green ActorHitProxyMask01.blue ActorHitProxyMask01.alpha}
add_layer {ActorHitProxyMask02 ActorHitProxyMask02.red ActorHitProxyMask02.green ActorHitProxyMask02.blue ActorHitProxyMask02.alpha}
Cryptomatte {
name Cryptomatte1
xpos 66
ypos -87
matteOutput alpha
matteList LivingRoom/CoffeeTable/BP_NewtonsCradle.NewtonsCradle
cryptoLayer ActorHitProxyMask
expression "((ActorHitProxyMask00.red == 30057640.0) ? ActorHitProxyMask00.green : 0.0) + ((ActorHitProxyMask00.blue == 30057640.0) ? ActorHitProxyMask00.alpha : 0.0) + ((ActorHitProxyMask01.red == 30057640.0) ? ActorHitProxyMask01.green : 0.0) + ((ActorHitProxyMask01.blue == 30057640.0) ? ActorHitProxyMask01.alpha : 0.0) + ((ActorHitProxyMask02.red == 30057640.0) ? ActorHitProxyMask02.green : 0.0) + ((ActorHitProxyMask02.blue == 30057640.0) ? ActorHitProxyMask02.alpha : 0.0) + 0"
keyedName ""
previewExpression0 "((mantissa(abs(ActorHitProxyMask00.red)) * 1 % 0.25) * ActorHitProxyMask00.green + (mantissa(abs(ActorHitProxyMask00.blue)) * 1 % 0.25) * ActorHitProxyMask00.alpha + (mantissa(abs(ActorHitProxyMask01.red)) * 1 % 0.25) * ActorHitProxyMask01.green + (mantissa(abs(ActorHitProxyMask01.blue)) * 1 % 0.25) * ActorHitProxyMask01.alpha)"
previewExpression1 "((mantissa(abs(ActorHitProxyMask00.red)) * 16 % 0.25) * ActorHitProxyMask00.green + (mantissa(abs(ActorHitProxyMask00.blue)) * 16 % 0.25) * ActorHitProxyMask00.alpha + (mantissa(abs(ActorHitProxyMask01.red)) * 16 % 0.25) * ActorHitProxyMask01.green + (mantissa(abs(ActorHitProxyMask01.blue)) * 16 % 0.25) * ActorHitProxyMask01.alpha)"
previewExpression2 "((mantissa(abs(ActorHitProxyMask00.red)) * 64 % 0.25) * ActorHitProxyMask00.green + (mantissa(abs(ActorHitProxyMask00.blue)) * 64 % 0.25) * ActorHitProxyMask00.alpha + (mantissa(abs(ActorHitProxyMask01.red)) * 64 % 0.25) * ActorHitProxyMask01.green + (mantissa(abs(ActorHitProxyMask01.blue)) * 64 % 0.25) * ActorHitProxyMask01.alpha)"
previewExpression3 ""
previewChannel none
in00 ActorHitProxyMask00
in01 ActorHitProxyMask01
in02 ActorHitProxyMask02
in03 none
in04 none
in05 none
in06 none
in07 none
in08 none
in09 none
in10 none
in11 none
}
push $N56cf6800
Dot {
name Dot1
xpos 13
ypos -171
}
Dot {
name Dot2
xpos 13
ypos -32
}
HueShift {
inputs 1+1
saturation 2.32
color_saturation 0.94
hue_rotation 88
name HueShift1
xpos 66
ypos -36
}
Dot {
name Dot3
xpos 194
ypos -32
}
Dot {
name Dot4
xpos 194
ypos -206
}
add_layer {FinalImageMovieRenderQueue_WorldDepth FinalImageMovieRenderQueue_WorldDepth.red FinalImageMovieRenderQueue_WorldDepth.green FinalImageMovieRenderQueue_WorldDepth.blue FinalImageMovieRenderQueue_WorldDepth.alpha}
ZDefocus2 {
z_channel FinalImageMovieRenderQueue_WorldDepth.red
math depth
fill_foreground false
center {{"[metadata exr/unreal/camera/FinalImage/focalDistance]"}}
focal_point {960 540}
size {{"((input.height*(focalLength*focalLength / (fstop * (focalDistance - focalLength)))*.5 / sensorWidth)/10)" x1 26}}
max_size 100
filter_type bladed
legacy_resize_mode false
show_legacy_resize_mode false
blades {{"[metadata exr/unreal/camera/ActorHitProxyMask/dofDiaphragmBladeCount]"}}
name ZDefocus1
xpos 296
ypos -216
addUserKnob {20 User}
addUserKnob {7 focalLength l "Focal Length"}
focalLength {{"[metadata exr/unreal/camera/FinalImage/focalLength]"}}
addUserKnob {7 focalDistance l "Focal Distance"}
focalDistance {{"[metadata exr/unreal/camera/FinalImage/focalDistance]"}}
addUserKnob {7 sensorWidth l "Sensor Width"}
sensorWidth {{"[metadata exr/unreal/camera/FinalImage/sensorWidth]"}}
addUserKnob {7 fstop l Fstop}
fstop {{"[metadata exr/unreal/camera/FinalImage/fstop]"}}
}
set N62ca2800 [stack 0]
push $N62ca2800
add_layer {FinalImageMovieRenderQueue_MotionVectors FinalImageMovieRenderQueue_MotionVectors.red FinalImageMovieRenderQueue_MotionVectors.green FinalImageMovieRenderQueue_MotionVectors.blue FinalImageMovieRenderQueue_MotionVectors.alpha}
ShuffleCopy {
inputs 2
in FinalImageMovieRenderQueue_MotionVectors
in2 none
red green
green red
out FinalImageMovieRenderQueue_MotionVectors
name RG_TO_GR
xpos 296
ypos -178
}
Add {
value -0.5
name Subtract_05
xpos 296
ypos -152
}
Multiply {
channels FinalImageMovieRenderQueue_MotionVectors
value {0.5625 1 1 1}
name MultiplyByAspectRatio
xpos 296
ypos -114
}
Add {
value 0.5
name Add_05
xpos 296
ypos -76
}
VectorBlur2 {
uv FinalImageMovieRenderQueue_MotionVectors
mv_presets "V-Ray Velocity"
uv_offset -0.5
blur_type uniform
scale {{width}}
soft_lines true
maskChannelInput FinalImageMovieRenderQueue_WorldDepth.red
name VectorBlur3
xpos 296
ypos -38
}
Viewer {
frame 1
frame_range 1-100
colour_sample_bbox {0.8895833492 -0.2208333313 0.890625 -0.2197916657}
samplepoints {{0.8895833492 -0.2208333313}
}
name Viewer1
xpos 292
ypos 12
}
此外,由于虚幻在X和Y中都存储规格化为[0-1]的运动向量,你需要将红色通道重新调整到ImageHeight和ImageWidth(在本示例中为1080、1920)或0.5625。要执行此重新调整,从速度通道中减去0.5,乘以0.5625,然后向速度通道加回0.5,再将其连接到VectorBlur节点。如果不重新调整红色通道,就会为动态模糊造成不正确的角度。
与模板层一样,此功能旨在与基于OCIO的工作流程组合使用。景深必须应用于线性空间中的图像,以便确定哪些高光明亮得足以创建散景。禁用色调曲线后,你的图像的外观会发生变化。使用基于OCIO的工作流程,你可以可视化视口中的最终外观,并在后期制片中将外观重新应用于你的图像,以重新创建外观。
如果你想试验Nuke节点创建,可以从上述示例 下载帧和Nuke文件。
UI渲染器
UI渲染器(UI Renderer) 会使用alpha将添加到视口的 Slate 或 UMG 控件渲染为单独的输出。你可以在复合程序中将此渲染器与你的最终图像组合在一起,添加你想渲染的UI元素。