渲染通道

了解有关影片渲染队列中不同渲染通道层的信息。

Windows
MacOS
Linux

影片渲染队列支持在不同的通道中渲染不同类型的输出图像,例如最终图像、对象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)"。

模板层Nuke色调

要像这样正确重新组合多个图像,图像应该在线性空间中导出(在"颜色输出(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通道

设置

对象ID通道需要满足特定要求,才能正确渲染:

  1. 为你打算与对象ID通道一起复合的渲染通道启用 禁用多重采样效果(Disable Multisample Effects)。这将排除动态模糊、景深、抗锯齿和其他会混合多层像素的后期处理,确保所有对象都保持轮廓鲜明的边缘。只有这样做,对象ID通道才会与最终图像吻合。

    禁用多重采样效果

  2. 延迟渲染器(Deferred Renderer) 设置下,展开 额外后期处理材质(Additional Post Process Materials),然后启用 MovieRenderQueue_WorldDepthMovieRenderQueue_MotionVectors 材质。

    额外后期处理材质

  3. 确保你的 屏幕百分比(Screen Percentage) 在序列中的所有 电影摄像机Actor 上都设置为 100。只有这样做,对象ID通道才会与最终图像吻合。

    对象ID屏幕百分比

  4. 抗锯齿(Anti-aliasing) 设置添加到你的作业,并将 空间示例数量(Spatial Sample Count) 设置为至少 8。还要启用 覆盖抗锯齿(Override Anti Aliasing) 并将 抗锯齿方法(Anti Aliasing Method) 设置为 无(None)

    对象ID抗锯齿

    这样你就可以克服不支持TAA的局限性。使用 时间示例数量(Temporal Sample Count) 不太可能生成所需的结果,因为缺少动态模糊来覆盖每个示例之间的缺口;你最终会得到淡淡地相互叠加的多个对象副本。

  5. .exr序列(.exr Sequence) 输出模式添加到你的设置,并激活或删除其他导出格式。确保 多层(Multilayer) 属性已 启用

    对象ID exr

实施这些设置后,启动影片渲染队列时,它将输出一个多层EXR,其中包括最终图像、对象ID、世界深度和运动向量。

对象ID使用 Cryptomatte 规格存储在EXR文件中,并且读取此数据的插件可用于第三方软件。

对象ID渲染通道在虚幻引擎中是试验性的。只在虚幻编辑器中可用,不能用于发行版本。

对象ID分组

默认情况下,唯一颜色或ID会分配给关卡中的每个Actor或组件。你可以在 对象ID(Object Ids) ID类型(Id Type) 属性上更改。

对象ID组

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。

Nuke图表示例

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将添加到视口的 SlateUMG 控件渲染为单独的输出。你可以在复合程序中将此渲染器与你的最终图像组合在一起,添加你想渲染的UI元素。

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消