运动模糊着色器

运动模糊
介绍
使用现实世界摄影机拍摄的现实世界对象会显示出运动模糊。在 mental ray 中渲染时,可以选择若干种方法之一来实现这些平衡。主要有三种不同的方法:
- 光线跟踪 3D 运动模糊
- 快速光栅化器(也称为“快速扫描线”)3D 运动模糊
- 后期处理 2D 运动模糊
每种方法都有其优点和缺点:
光线跟踪 3D 运动模糊
这是最高级的、“全功能”的运动模糊类型。对于像素内的每个空间采样,会发射许多临时光线。光线数由选项块中设置的“时间对比度”定义,实际数量为 1/“时间对比度”(如果启用了特殊模式“快速运动模糊”,将为每个空间采样发送单个临时采样1)。
由于每条光线都是在不同的时间发射的,因此所有物体都会以物理上正确的方式进行运动模糊。在自身的镜像平面上移动的平面移动镜像将仅在其边上显示模糊 - 镜像反射本身处于静态。阴影、反射、体积效果等一切都将正确地进行运动模糊。运动可能是多段的,这表示旋转对象可能具有运动模糊“条纹”,沿圆弧而不是直线移动。
但是,代价是渲染时间变长,因为将在临时采样位置执行多次完全光线跟踪,且跟踪每条光线来计算采样的完全着色模型。
使用此类型的运动模糊,将大大增加运动模糊对象的渲染时间,增加的时间与临时采样数(即 1/“时间对比度”)大致呈线性关系。
快速光栅化器(也称为“快速扫描线”)运动模糊
光栅化器 mental ray 3.4 中引入的新“扫描线”渲染器,执行非常高级的子像素细分,这样可以将着色与曲面采样分离。
光栅化器获取一组着色采样,并将少数着色采样作为空间采样重用。实际的优点是,可以实现快速运动模糊(以及极高质量的抗锯齿,这是在处理头发渲染时通常应使用光栅化器的原因)。
代价是将重用着色采样。这表示,先前示例中的平面镜像实际上在其镜像中将反射与镜像本身涂抹在一起。在大多数实际情况中,此区别在视觉上并不显著。
运动模糊仍然是全 3D 的,而其主要优点在于渲染时间不会随每像素采样数线性增加,即使用每像素 64 个采样所花费的时间并不是每像素 16 个采样的四倍。渲染时间更多地受每像素着色采样数影响。
后期处理 2D 运动模糊
最后,我们将运动模糊用作后期处理。工作原理为:使用由渲染相位存储的像素运动向量并将这些向量“涂抹”到运动模糊的可视模拟。
与使用光栅化器相似,这表示镜像图像或者甚至通过前景透明对象看到的对象将与前景对象一起“形成条纹”。此外,由于运动帧缓冲区仅存储一个分段,因此“条纹”总是直的,从来不会弯曲。
此方法主要的优势在于渲染速度。场景或明暗器的复杂性不起作用。该模糊将在完成主要渲染过程后执行 mental ray“输出着色器”时应用。输出着色器的执行时间取决于需要模糊的像素数量,以及每个像素需要“涂抹”的程度。
使用 2D 运动模糊时的注意事项
渲染运动向量
渲染场景时必须启用运动向量帧缓冲区并填充正确的运动向量。这可以通过在渲染时启用运动模糊但将快门长度设置为零来完成。
shutter 0 0
motion on
请注意顺序:必须先将快门长度设置为“0 0”,然后再启用运动模糊。
在旧版本的 mental ray 中,必须进行以下构建:
motion on
shutter 0 0.00001
time contrast 1 1 1 1
这表示:
- 设置极短但非零的快门长度
- 使用时间对比度 1 1 1 1
如果存在问题,并且运动模糊不可见,请尝试上述替代设置。
视觉差异 - 不透明度和背景
3D 模糊是对象沿时间轴移动时的真实渲染。2D 模糊是该效果的模拟,通过获取静止图像并沿 2D 屏幕上运动向量形成条纹来实现。
请务必了解,这会导致稍微不同的视觉结果。
例如,一个对象在快门间隔内移动的距离等于自身的宽度,则轨迹上的每个点都会被有效占用 50% 的时间。这表示对象的运动模糊“条纹”将有效地渲染为 50% 透明度,该对象背后的任何背景将相应地透过该对象显示出来。
相反,以 2D 运动模糊渲染的对象将渲染在固定位置,并稍后将这些像素涂抹到运动模糊条纹中。这表示,在对象最初占用(涂抹前)的位置,对象保持完全不透明,且不会显示任何背景,而“条纹”将从该位置向两边淡出,并允许透过每个侧面来显示背景。
最终结果是,使用 2D 模糊时显示的移动对象比使用 3D 模糊时稍微更加“不透明”。在大多数情况下,对于适中的运动,这不会成为问题,也不会被视为问题。只有在运动模糊的极端情况下,这才会导致重大的问题。

3D 模糊

2D 模糊
快门和快门偏移
为了说明 mental ray 快门间隔的此行为,我们使用这些图像 - 一组静止的圆锥体和两个移动的格子球,在第 0 帧,球位于第一个圆锥体上方,在第 1 帧,球位于第二个圆锥体上方,依此类推。

t=0 时的对象

t=1 时的对象
使用 3D 运动模糊时,mental ray 虚拟摄影机快门在“快门偏移”设置的时间打开,并在“快门”设置的时间关闭。
以下是快门偏移为 0,快门为 0.5 时的结果 - 对象模糊从 t=0 开始,持续到 t=0.5 结束。

3D 模糊,快门在 t=0 时打开,t=0.5 时关闭
现在,使用 2D 运动模糊,请务必了解 2D 模糊的工作原理。帧在“快门偏移”时间渲染,然后使这些像素向前和向后形成条纹以创建模糊效果,因此,在相同的设置下,会生成以下模糊效果:

2D 模糊,快门偏移=0,mip_motionblur 快门=0.5
请注意,此行为与 3D 模糊的情况不同!如果需要混合使用这两种方法,请务必使用此类设置以使模糊的计时相同。
这可以通过将“快门偏移”时间更改为需要的模糊中心时间(在此示例中,t=0.25)实现,如下所示:
shutter 0.25 0.25
motion on

2D 模糊,快门偏移=0.25,mip_motionblur 快门=0.5
请注意它是如何与快门偏移为 0 的 3D 模糊设置匹配的。但是,如果 3D 模糊的快门偏移为 0.25,快门长度为 0.5(即“shutter 0.25 0.75”语句),则结果如下:

3D 模糊,快门在 t=0.25 时打开,t=0.75 时关闭
至此,已明确以下内容:在合成以不同方法完成的渲染时,牢记计时差异非常重要!
mip_motionblur 着色器
mip_motionblur 着色器是 mental ray 输出着色器,用于执行 2.5D2 运动模糊作为后期处理。
declare shader "mip_motionblur" (
scalar "shutter",
scalar "shutter_falloff",
boolean "blur_environment",
scalar "calculation_gamma",
scalar "pixel_threshold",
scalar "background_depth",
boolean "depth_weighting",
string "blur_fb",
string "depth_fb",
string "motion_fb",
boolean "use_coverage"
)
version 1
apply output
end declare
shutter 是快门处于“打开”状态的时间长度。实际上,这表示在渲染图像后,向前和向后同时涂抹像素以形成条纹,每个方向上的距离等于对象在快门时间内移动的距离的一半。
shutter_falloff 设置涂抹的衰减速度,即涂抹褪色到透明的速度。这调整模糊的“柔和度”:

衰减 = 1.0

衰减 2.0

衰减 = 4.0
请注意,在第一个图像中高光形成的条纹几乎为一条直线,但是在最后一个图像中更加温和地逐渐减少。
显然,运动模糊的感知长度随衰减的增加而减少,因此需要通过轻微增加快门时间来进行补偿。
因此,需要过亮高光明确“形成条纹”的效果时衰减特别有用,方法是:使用夸张的快门长度(大于影片的默认值 0.5)和更高的衰减,过亮有可能以令人满意的方式变模糊。
blur_environment 定义摄影机环境(即背景)是否应随摄影机的移动产生模糊。启用时,环境的像素将产生模糊,禁用时则不会。请注意,仅当在选项块中禁用“扫描线”时,摄影机驱动环境模糊才会起作用。
如果背景是由场景中的几何体创建的,则不会应用此设置,背景模糊将改变为这些几何体的运动。
calculation_gamma 定义在何种情况下执行 Gamma 颜色空间模糊计算。由于 mental ray 输出着色器作用于写入的帧缓冲区,而且这些缓冲区(浮点除外)已经应用了任何 Gamma 校正,因此使用适当的 Gamma 应用后期效果很重要。
如果以线性浮点进行渲染,并计划在稍后的阶段进行适当的 Gamma 校正,请将 calculation_gamma 设置为 1.0,否则将其设置为适当的值。此设置也可用于运动模糊“外观”的艺术控制,此时较高的 Gamma 值会在条纹中提升亮度(相对于黑暗度)。

各种 Gamma
请注意,低 Gamma 示例看起来更加暗,且绿色长方体和红色球体之间的模糊看起来非常可疑。较高的 gamma 值产生的混合更加平滑,运动模糊更加符合实际。但是,要继续强调的是,如果随后在管道中应用 Gamma 校正,calculation_gamma 参数应保持为 1.0,除非您真的需要在模糊中提升亮度以实现艺术效果。
pixel_threshold 是在添加模糊之前对象必须移动的最小运动向量长度(以像素为单位)。如果设置为 0.0,则没有效果;而且每个对象(即使具有均匀子像素移动)都将略微有一些模糊量。虽然这在技术上是精确的,但可能会感觉图像过于模糊。
例如,一个低空飞行的喷气式飞机飞向地平线上的热带岛屿,在该飞机的座舱视图中,即使岛屿的移动非常轻微,但仍然应为地平线上的岛屿添加一些运动模糊。同样地,在非常缓慢地转向一个对象时也应添加模糊。这会导致物体看起来没有对准焦点,这是不可取的。这可以通过设置 pixel_threshold(例如,设置为 1.0)来解决,其效果是在所有运动向量的长度中减去一个像素,从而使所有对象在不具有任何移动模糊的帧之间仅移动一个像素(或更少)。通常,此值应保持为非常低(大约一个像素或更低)以接近真实效果,但也可以设置为较高值以实现艺术效果。
background_depth 设置到背景的距离,这有助于算法推测场景的深度布局。此值应大约等于场景深度,即,与摄影机的距离超出此值的任何物体都被算法视为“遥远”。
如果禁用了 depth_weighting,则使用启发式算法,对对象的模糊进行深度排序。有时,默认算法会导致远处对象的模糊施加在近处对象的模糊上。因此,需要启用 depth_weighting 以使用替代算法。这会使摄影机近处(与摄影机的距离小于 background_depth)的对象的模糊效果比远处对象的更加“不透明”,看起来像是在远处对象的模糊“的上面涂上”近处对象的模糊。由于这可能会导致摄影机近处的对象的模糊不切实际地不透明,因此默认情况下禁用此选项。当可以明确分离移动的前景对象和(相对)静态背景时,此模式非常有用。
blur_fb 设置要添加模糊效果的帧缓冲区的 ID3。空字符串(“ ”)表示主颜色帧缓冲区。引用的帧缓冲区必须是 RGBA 颜色缓冲区,并且必须由适当的着色器写入。
depth_fb 设置要从中获取深度信息的帧缓冲区的 ID。空字符串(“ ”)表示主 mental ray Z 深度帧缓冲区。引用的帧缓冲区必须是深度缓冲区,并且必须由适当的着色器写入。
motion_fb 的效果与 depth_fb 相同,除了对于运动向量信息以外,且此处的空字符串表示默认的 mental ray 运动向量帧缓冲区。引用的帧缓冲区必须是运动缓冲区,并且必须由适当的着色器写入。
如果启用了 use_coverage,则在决定如何在两个移动对象之间利用包含抗锯齿混合的边像素时,可利用“覆盖”通道(而不是 Alpha 通道)的信息。
使用 mip_motionblur
如前所述,mip_motionblur 着色器要求以运动向量渲染场景:
shutter 0 0
motion on
该着色器本身也必须作为输出着色器添加到摄影机中:
shader "motion_blur" "mip_motionblur" (
"shutter" 0.5,
"shutter_falloff" 2.0,
"blur_environment" on
)
camera "...."
output "+rgba_fp,+z,+m" = "motion_blur"
...
end camera
该着色器需要深度(“Z”)和运动(“M”)帧缓冲区,且两者必须同时为插值(“+”)或都不为(“-”)。该着色器已为使用插值缓冲区而进行优化,但也可以正常使用非插值。
如果要使用着色器正确保留过亮(比白色更加白的颜色)并将其形成条纹的功能,颜色帧缓冲区必须为浮点型(“rgba_fp”),否则它可以为普通的“rgba”。
多个帧缓冲区和运动模糊
如果使用的着色器写入多个帧缓冲区,则可以将 mip_motionblur 着色器的多个副本依次连接起来,每个副本引用不同的 blur_fb,这样就可以通过一个渲染操作对多个帧缓冲区进行模糊。请注意,只有颜色帧缓冲区可以进行模糊!
另请注意,对于合成操作,建议您不要将 calculation_gamma 设为 1.0 以外的值,否则合成计算可能无法正常工作。请确保在合成阶段使用正确的 Gamma 管理。
合适的默认值
以下是一些建议的默认值:
对于相当标准外观的模糊,将 shutter 设置为 0.5,将 shutter_falloff 设置为 2.0。
对于更“柔和”外观的模糊,将 shutter 增大至 1.0,但同时将 shutter_falloff 增加至 4.0。
要匹配其他 mental ray 渲染的模糊,请将 mental ray 快门偏移(在选项块中)设置为 mip_motionblur 中设置的快门长度的一半。要将运动模糊与匹配移动的长度进行匹配(即关键帧趋向于模糊的中心),请将快门偏移设置为 0。
mip_motion_vector 着色器
有时,可能会希望在应用运动模糊之前进行合成工作,或者希望使用某些特定的第三方运动模糊着色器。此时请使用 mip_motion_vector 着色器,其目的在于在像素空间(mental ray 的标准运动向量格式采用世界空间)中导出编码为颜色的运动。
有几种不同的方法可将运动编码为颜色,此着色器支持最常用的方法。
大多数第三方工具希望将运动向量编码为颜色,其中红色为 X 轴,绿色为 Y 轴。为了适应颜色限制(特别是在未使用浮点或范围仅从黑色到白色的颜色),运动将按比例因子缩放(此处称为 max_displace),并将得到的 -1 到 1 的范围映射到颜色通道(范围为 0 到 1)。
该明暗器还支持多种不同的浮点输出模式。
该着色器的外观如下:
declare shader "mip_motion_vector" (
scalar "max_displace" default 50.0,
boolean "blue_is_magnitude",
integer "floating_point_format",
boolean "blur_environment",
scalar "pixel_threshold",
string "result_fb",
string "depth_fb",
string "motion_fb",
boolean "use_coverage"
)
version 2
apply output
end declare
参数 max_displace 设置编码运动向量的最大长度,且此数量的像素(或更多)的运动向量将编码为最大值,以在颜色限制(即白色或黑色)内表达。
要最大程度地利用所选图像格式的分辨率,通常建议您将 max_displace 的值 50 用于 8 位图像(这其实并不适合此目的),将 2000 用于 16 位图像。该明暗器将输出在帧中遇到的最大运动向量的信息语句,以帮助调试此参数。有关更多详细信息,请查阅第三方运动模糊着色器的文档。
如果 max_displace 为零,则相对于图像分辨率对运动向量进行编码,即,对于 600 像素宽、400 像素高的图像,正 X 方向移动 600 像素编码为红色通道的 1.0,负 X 方向移动 600 像素编码为 0.0。正 Y 方向移动 400 像素编码为蓝色通道的 1.0,等等4。
如果启用了 blue_is_magnitude,则蓝色通道表示模糊的幅值,红色和绿色通道仅编码 2D 方向。禁用时,将不使用蓝色通道,并且红色和绿色通道同时对方向和幅值编码。同样,请查阅第三方运动模糊着色器的文档5。
如果 floating_point_format 不为零,则着色器将真实、浮点运动向量写入红色和绿色通道。它们不会规格化为 max_displace 长度,也不会被剪裁,将同时包含正值和负值。启用此选项时,max_displace 和 blue_is_magnitude 都不起任何作用。
当前支持两种不同的浮点输出格式:
- 1:实际像素计数按原样写为浮点格式。
- 2:考虑像素纵横比6,以便像素移动距离的度量以 Y 方向的像素数表示,X 分量将按像素纵横比进行缩放。
将来可能会添加更多浮点格式。
启用 blur_environment 时,为由摄影机移动控制的空白背景区域生成运动向量。如果使用扫描线渲染器,则此选项不起作用。
pixel_threshold 是生成非零向量前对象必须移动的运动向量的最小长度(以像素为单位)。实际上,只需从运动向量中减去此长度,然后将其导出。
result_fb 定义要将结果写入的帧缓冲区。如果未指定它(空字符串),则将结果写入标准颜色缓冲区。但是,为运动向量定义单独的帧缓冲区并将其 ID 放置到此处将更加有用。这样就可以在一个过程中完成美景渲染和运动向量渲染。它应是颜色缓冲区,且不应包含任何内容,因为无论如何其内容都将由此着色器覆盖。
depth_fb 设置要从中获取深度信息的帧缓冲区的 ID。空字符串(“ ”)表示主 mental ray Z 深度帧缓冲区。引用的帧缓冲区必须是深度缓冲区,并且必须由适当的着色器写入。
motion_fb 的效果与 depth_fb 相同,除了对于运动向量信息以外,且此处的空字符串表示默认的 mental ray 运动向量帧缓冲区。引用的帧缓冲区必须是运动缓冲区,并且必须由适当的着色器写入。
使用 mip_motion_vector
有关生成运动向量的注意事项,请参考使用 mip_motionblur(usingpostblur 页面)的情况,以及计时页面上有关后期处理运动模糊与全 3D 模糊之间的计时区别的讨论。
此外,通常希望为每个运动向量创建单独的帧缓冲区,并将它们保存到一个文件。以下是伪 .mi 语法的一部分:
options ...
...
# export motion vectors
shutter 0 0
motion on
...
# Create a 16 bit frame buffer for the motion vectors
frame buffer 0 "rgba_16"
end options
...
shader "motion_export" "mip_motion_vectors" (
"max_displace" 2000,
"blur_environment" on,
# our frame buffer
"result_fb" "0"
)
...
camera "...."
# The shader needs z, m
output "+z,+m" = "motion_export"
# Write buffers
output "+rgba" "tif" "color_buffer.tif"
output "fb0" "tif" "motion_buffer.tif"
...
end camera
脚注- 1
-
启用“快速运动模糊”模式的方法是:将“时间对比度”设置为零,并将图像采样速率的上限和下限设为相同的值,即类似于“samples 2 2”。请在以下网址阅读更多有关“快速运动模糊”模式的信息:http://www.lamrug.org/resources/motiontips.html
- 2
- 由于它还考虑到对象之间的 Z 深度关系,因此称为“2.5D”
- 3
-
此参数的类型为 string,以支持 mental ray 3.6 中引入的命名帧缓冲区。如果不使用命名帧缓冲区,则需要在此字符串中包含数字,即“3”表示帧缓冲区编号 3。
- 4
- 此模式将不适用 8 位图像,因为 8 位图像的分辨率不足。
- 5
- ReVisionFX“Smoothkit”要求向量启用了 blue_is_magnitude,而其“ReelSmart 运动模糊”则不要求。
- 6
- 与 Autodesk Toxik 兼容。