后处理与你
如果你以前从未接触过它,后期处理将会是一个神秘话题。随着标准的不断变化,多年来各种游戏和应用程序对“后处理”定义各不相同,这使得这个术语相当令人困惑。本指南将解释在 Unity 和 VRchat 中的后处理是什么,以及为什么你应该在所有东西上都使用它。
本文章基于我的如下教程
https://gitlab.com/s-ilent/SCSS/-/wikis/Other/Post-Processing
作者:silent
文章原址:Post Processing and You | VRCLibrary
注意:当前文档尚未经过翻译校对,部分内容可能存在谬误。
- 为什么后处理(post-processing)很重要?
- 安装后处理栈(post-processing stack)
- 在场景中设置后处理(Post Processing)
- 设置本地后处理体积(local post-processing volumes)
- 创建后处理(Post-Process)配置文件
- 使用后处理(post-process)时的场景设置技巧
为什么后处理(post-processing)很重要?
要真正理解后处理(post-processing)是如何工作的,我们需要绕个弯。
这是一台相机。
传统相机的工作原理是使用镜头将图像聚焦到一张经过化学处理的胶片上。胶片暴露在光线下,会发生化学反应。光线响应胶片,将图像蚀刻到胶片上。
镜头的特性——它的完整程度,它的弯曲程度——会导致捕获的图像中出现某些伪影。例如,明亮光源周围的光环通常是由镜头的不完美散射光线造成的。
人眼的工作方式不同,但基本原理相同——光、镜头、受体、化学反应。
在摄影和图像捕捉的历史中,一种特殊的模式出现了。说一张照片没有它被拍摄的地方那么亮是很明显的。但它仍然看起来像真实的东西。这是怎么回事?
这是因为光线和胶片之间的化学反应被精心调整以不同方式响应不同水平的光线。如果你听说过“胶片库存(film stock)”,这就是它们之间的区别-不同的库存有不同的化学特性,对光的响应也不同。
在这张图片中,标有伽马符号的虚线部分是在不进行后处理的情况下可以看到的所有内容。
回到要点;为什么要了解后期处理?因为你的显示器或VR头盔都没有它们显示的地方那么亮。为了解决这个问题,解决方案与胶片相同-具有适应自然外观的光响应曲线。这就是“色调映射”。有了这个,你就有了渲染的基本元素。
这也适用于单元格着色和非照片级真实感渲染。毕竟,绘画和艺术品没有现实世界那么明亮。为了在VR中让事物看起来正确,我们需要使用正确的着色来唤起我们的色彩对比,这就是色调映射的目的。
这些是后处理的真实基础。
而且,Unity 默认情况下不会执行任何这些操作,直到你添加后期处理堆栈!在没有后期处理的场景中,你看到的所有内容都只是原始的颜色/光照数据,随意地显示在你的显示器上。颜色会发生变化,明亮区域和物体在变亮时看起来会很奇怪-这些都与我们用肉眼看到的期望不符。
这也适用于 Unity 编辑器。当你在世界中设置灯光时,你应该已经设置并启用了后处理-可能是你要添加的第二或第三件事。如果你不这样做,你会得到一些毫无意义的灯光强度,导致你的世界的某些区域过于黑暗/明亮。尽管后期处理是游戏中最后渲染的内容,但它应该在创建世界的一开始就设置好。
安装后处理栈(post-processing stack)
首先,你需要获取 VRChat 支持的后处理栈(post-processing stack)的最新版本。
注意:Post Processing v2 是免费的。它不需要花钱,而且并且不在 Unity 资产商店中。千万不要在资产商店购买后处理系统,这些系统无法在 VRChat 中被使用。
幸运的是,VRChat 的最新 SDK 版本将自动为你安装它!
但是,以防你确实没有它,以下将给出手动安装步骤:
- 从菜单栏中的“窗口(Window)”菜单中选择“包管理器(Package Manager)”。
- 在包管理器(Package Manager)窗口的左上角选择“所有包(All packages)”。
- 选择“后处理(Post Processing)”。
- 在右上角,选择版本 3.0.3 并单击“安装(Install)”。
现在你已经安装了 Post Processing v2!
在场景中设置后处理(Post Processing)
好的,现在你已经安装了它,让我们来了解一下使用后处理(Post Processing)的基础知识。首先,我们需要讨论后处理体积(post-processing volumes)和它们的工作原理。
注意:VRWorld Toolkit 可以为你设置后处理!我建议使用它来安装并在你的场景中设置它。
在设置后处理(Post Processing)时,需要关注两个主要组件:
- 后处理层(Post Processing Layer),它位于相机上并接收后处理。当你将这个添加到你的相机时,它会设置相机作为图层触发器。
- 后处理体积(Post Processing Volume),它位于地图中并呈现后处理。当层触发器位于体积内时,它将获得该体积区域分配的后期处理。你可以在地图中有几个带有不同色彩分级设置的卷,或者甚至通过动画或切换对象来创建可调节的图形选项!
带有碰撞器/触发器组件的体积将影响其内部的所有内容。你还可以在这里设置从0%到100%的过渡。
体积设置为全局(Global )将覆盖整个地图。这意味着你可以利用·体积修改来自触发器(triggers)和动画(animations)的后处理!
体积强度(volume intensity)滑块可以被动画化。这意味着你可以将后处理与动画触发器(trigger)绑定,从而改变体积强度。
这东西如何设置呢?首先,让我们来介绍并添加一个全局场景配置文件(global scene profile)。
- 在主相机(Main Camera)上添加一个后处理层(Post Processing Layer)。这个图层是用于接收后处理的。请注意,触发器会自动设置为你的相机。这意味着相机位置决定了后处理层使用的设置。
请确保将此相机设置为 VRC_Scene Descriptor 中的参考相机(Reference Camera)。
另外,你需要为你的后处理层(Post Processing Layer)选择一个图层,即一个普通的 Unity 图层(Unity Layer)。这是很重要的,如果没有设置图层,就将无法看到你的后处理体积。所有体积都需要在 Unity 中分配至这个图层。因为后处理(Post Processing)系统只会扫描这个图层上的所有对象,所以我建议选择一个没有很多其他对象的层,这里我们使用 Water 层。
注意:请将抗锯齿(Anti-aliasing)设置改为"无抗锯齿(No Anti-aliasing)",然后不要碰它。使用抗锯齿在最差的时候可能导致的VR脑裂(双重画面撕裂),最好的情况下也会导致半透明闪烁。VRC 已经预装了抗锯齿系统。
- 在你的场景中创建一个新的游戏对象,并为其添加一个后处理体积(Post Processing Volume)组件。勾选“全局(Global)”复选框。注意:你不能在同一个对象上装配有体积和图层组件。请确保这个对象不是你的相机的子对象,否则可能会遇到问题。
- 我做了一个示例文件以让事情变得更简单一些。你可以在这里下载它!(右键单击并另存为...)将其放入你的 Assets 文件夹中,然后将其拖放到你的后处理体积中。
- 完成了!你现在应该可以看到你的场景中出现明显的不同。
继续阅读以了解如何设置一个覆盖特定区域的后处理体积。
设置本地后处理体积(local post-processing volumes)
接上一页,我们设置了一个全局后处理体积(global post-process volume)。接下来,让我们来讨论如何添加一个仅影响场景中一小块特定区域的自定义效果 - 后期处理体积(post-process volume)。
- 在您的场景中创建一个新的 GameObject,并为其添加一个碰撞器(collider),如 Box Collider。选中碰撞器上的 "Is Trigger"。
- 为带有碰撞器(collider)的对象(object)添加一个 Post Processing Volume 组件,然后点击 Profile 旁边的 New 按钮。
- 当您点击 New 时,将在您的地图旁边创建一个名为 Default Post Profile 的新配置文件。与 Stack v1 不同,您必须先添加特定效果,然后才能使用它们。这样可以确保 Volume blending 正常工作。
- 单击 Add effect... 并添加一些效果!首先我建议添加 Color Grading(色彩渐变)。 您可以使用右上角的 On/Off 按钮切换各个效果。激活后,您还需要激活每个部分的选项的特定覆盖(overrides)。对于基本配置文件,您可以单击顶部的 All,这将切换所有选项至生效。
- 至少目前一切看起来仍旧。您可以试着调整设置,您可能会发现依旧没有什么变化。但如果您将 Main Camera 移动到碰撞器(collider)内部,您会看到效果就此生效!您应该可以根据需要调整后处理效果,并添加更多后处理。与碰撞器形状相关的体积仅影响在其体积内的玩家。例如...
这个预设描绘了这样一个体积区块:在其内部时,一切都变成深沉而疯狂的红。不适合胆小或心智不健全的人进入!
但是您应该使用其中哪些设置?请继续阅读...
创建后处理(Post-Process)配置文件
在场景中添加后处理这一操作有公认的最佳答案,而以下则是你在操作过程中需要注意的事情。
首先,你应该先设置一个基本的 global post processing volume(全局后处理体积),用以配置一些基本的色调映射(tonemapping)和泛光参数(bloom parameters)。然后再使用单独的全局或局部体积进行色调偏移和其他效果。
例如,如果你想在游戏中关闭和打开 bloom(泛光),你可以整出一个额外的对象用于专门控制泛光,实现在游戏中交互以切换效果。请记住,单个体积可以覆盖的选项可多可少,你还可以使用动画(animations)在不同选项集之间平滑插值!
来让我们看看有哪些可用的设置!
Colour Grading(色彩分级)
最最重要的设置。有四个选项用于色调映射:None(无)、ACES、Neutral(中立)、Custom(自定义)。
- 不要选择“None(无)”。它什么作用也没有。
- ACES 提供了最电影级的图像效果,非常受现代、电影式游戏的欢迎。它具有夸张的对比度,大胆的颜色和白净的高光。
- Neutral(中立) 是几年前最受欢迎的游戏设置,很好地保留了原本的颜色。与 ACES 相比,它可能显得有些褪色,但它能够保留颜色的特点非常适合风格化场景。我建议在将 Neural 调整到 30-50 时增加对比度。
- Custom(自定义) 提供了许多选项,并允许你定义自己的 tonemapping curve(色调映射曲线)。仅建议用于真正想实现外观定制的专家。
在 ACES 和 Neutral 之间,你选择哪一个完全取决于你的喜好。可以试试两者,看看哪一个适合你的地图!使用 Neutral (中立)可以让你在保留现有地图的照明的同时获得 tone mapping(色调映射)的优势。它还非常适合用于调整其他颜色设置。而使用 ACES 可以获得丰富的色彩平衡,它需要强烈的照明才能充分发挥潜力,而最终结果往往会非常出色。
除了这一点只外,你还会获得一组用于更改场景颜色色调的选项。这些选项非常适合用于艺术创作,或者提供类似于夜间滤镜的选项,使世界变暗。如果你想玩一玩颜色,我建议使用 colour wheels(色轮),因为它有着十分精细的控制,可以调出惊人的细节!
但是,请保持较小的调整幅度!与在屏幕上显示的胶片或游戏不同,强烈大胆的色彩调色可能会使人感到不适,因为这会影响玩家看到的一切,也包括菜单。一个很管用的参照是,如果白色物体已经很难以识别为白色,那你已经做得太过分了。
Auto Exposure(自动曝光)
可以启用此选项,也可以不使用。
在真实的相机中,画面亮度和暗度由相机的 dynamic range(动态范围)和设置的 exposure point(曝光点)进行定义。此外,人眼还具有惊人的动态范围,因此即使在最暗和最亮区域之间存在很大的亮度差异,你也可以清楚地看到事物。
默认情况下,Auto Exposure(自动曝光)在你提高最小值或最大值之前不会做任何事情。Minimum(最小值)控制自动曝光会纠正的最低亮度大小,而Maximum(最大值)控制它会纠正的最高亮度大小。换句话说,如要使黑暗的地方更亮,请降低最小值;如要使明亮的地方更暗,请提高最大值。
在现实生活中,你看到的事物可能会变得非常明亮。因此,你可能会考虑使用更加明亮的光源并使用曝光来处理它们。然而,在 VRchat 中有一个需要注意的事项 - 任何使用不考虑到 Unity 灯光的着色器的对象都可能会变得太暗或太亮。
因此,为了安全起见,你应该将事物的亮度保持在默认值附近。这通常更多地取决于你的光照设置而非后处理,但是自动曝光也·会严重影响玩家如何体验这些光照设置。
Bloom(泛光)
这个设置应该根据个人口味自行启用和调整。
理想的设置一般意味着具有 较低的 Bloom 强度 和些许或基本没有阈值。这种组合拳意味着被通常照亮的对象不会产生可见的Bloom,但明亮的对象和 glancing reflections(掠射反射)会,从而在世界中正确地模拟一个干净但不完全干净的镜头。
- Intensity(强度):0.01到0.3,不要超过0.3!
- Threshold(阈值):低于1.0,但理想情况下为0。
- Soft Knee:1.0
- Clamp(钳位):30 - 不需要,用于防止某些类型的困扰。
- Radius(半径):理想情况下为7,但更高也可以
- Anamorphic(变形):理想情况下为0,因为它会随着 VR 中的头显而旋转。
- Fast Mode(快速模式):关闭,除非你的场景没有明亮的对象。
- Dirt(污垢):关闭。不要使用 Dirt。正如 Unity 会告诉您的那样,“在VR中使用 Dirt 纹理是不建议的。”
Bloom 是附加功能。Bloom 效果出来的任何光线都会添加到画面中。如果将 Bloom 的强度(Intensity)设置为1,这意味着所有事物的平均亮度将翻倍,并且所有事物在顶部都会变得模糊。此外,眼睛适应值(eye adaptation values)是在 Bloom 效果之前计算的,所以它不会阻止您的 Bloom 使画面过于明亮。
但如果 threshold(阈值)为零,难不成一切都会 Bloom(泛光)吗?
不,因为低 Bloom Intensity(强度)意味着只有明亮的对象才会有可见的泛光!
在 VRchat 中,照亮世界不仅取决于世界本身,还取决于玩家在世界中的外观。因此,依赖 Threshold(阈值)不是一个好主意。这就是一个糟糕的 Bloom 使用案例。由于 Threshold(阈值)的存在,只有画面中明亮的部分会有 Bloom ...但由于 Intensity(强度)很高,结果会变成 Bloom 从一件普通的白衬衫中疯狂爆出。
还有一个值得注意的是,超大的阈值会导致 Bloom 闪烁,引起眼睛疲劳。所以,请减轻 Intensity(强度)和 Threshold(阈值)!如果你的世界需要某些事物 Bloom 起来 ,那就直接让它们变得非常明亮。
要检查你的 Bloom 设置是否正确,请将一个白色球体(附带有白色 emission(自发光))的自发光强度调整至 1.0 强度处,并确保它几乎没有辉光。
Film Grain(电影颗粒)
你可以按照你的喜好进行调整,但不要使其过于浓烈,否则会让人感到不知所措!在 VR 中,电影颗粒在摄像头面前大约一米的距离产生加倍,设置得太强则会导致人们产生一种破碎的视差感。
与 Stack v1 不同的是,你不需要使用此功能来掩盖差劲的 dithering(抖动)。我在这里提到这一点以便你清楚知道你不应该使用它...除非你想要电影颗粒效果。
其他的一切
以上涵盖了你可以使用的内容。以下则是你不应使用的内容。
- Anti-aliasing(反锯齿):不要使用它。这东西超级爆使。SMAA会使屏幕加倍。FXAA会使一切都变得模糊。TAA会使一切都超级模糊,并让渲染对象顺序错误。总之,不要使用 Anti-aliasing(反锯齿)。
- Ambient occlusion(环境光遮蔽):Ambient occlusion 是一种在使用延迟渲染的游戏中最好的效果。VRchat 使用的是 Forward 渲染。这意味着它会在其他内容全部渲染后才将效果应用在一切之上,很差劲!Ambient occlusion 也没有针对 VR 进行优化,性能成本非常高,并且它为每个眼睛渲染的方式都不同!最重要的是,高质量的 AO(Ambient occlusion) 效果在 VR 中完全不可用。如果你想要 AO(Ambient occlusion),请单独烘焙你的照明。而不要使用这个。
- Depth of field(景深):性能成本很高,而且在 VR 中非常容易让人迷失方向。请尽量不要使用。如果你真的想使用,请将其默认禁用。
- Motion blur(运动模糊):如果你真的想使用它,请将其默认禁用。运动模糊会导致运动晕动症。在 VR 中,它会自动禁用。
- Screen-space Reflections(屏幕空间反射):仅适用于使用延迟渲染器的游戏。VRchat 不支持延迟渲染,因此无法使用。
- Lens Distortion(镜头失真):这种效果会让人们非常不舒服。它在 VR 中会导致晕动症。在 v2 中,Unity 会自动为 VR 禁用Lens Distortion(镜头失真)。
- Vignette(晕影):仅应在某些特定场景中使用。全覆盖的晕影会在 VR 中引起晕动症。
下一部分将涵盖设置场景后处理的最后注意事项。
使用后处理(post-process)时的场景设置技巧
在使用后处理(post-process)时,需要记住一些有用的经验法则以用在场景设计当中。
- 在现实生活中,物体在发出光之前首先会变得非常明亮...除非你使用的是雾蒙蒙的镜头。所以,不要将发光光源的发射物体 intensity(强度)设置为2,试着将其设置为12!
- bloom 的 falloff "shape"(衰减“形状”)取决于使用的 tonemapping(色调映射)类型,因此,整体的颜色能够被分级设置。使用 ACES tonemapping(色调映射),高强度红色将在核心处变为炽热的白热白色,而后逐渐变为橙色,但会投射出红色辉光。就像现实生活一样!但是,如果你想让超亮的红色发光红色带有红色核心,请使用 Neutral(中性)。
- 虽然很容易通过后处理控制场景中的颜色,但请先考虑通过更改光源的颜色来实现。这样看起来会更自然,因为色调映射的效果确实逆天,并且这么做不会影响菜单。
- 不要害怕,不断尝试,但最好首先让正常的 post processing(后处理)保持 plain(朴素) 和 neutral(中性) 。通过在场景中放置一个基本的 Unity 球体或立方体来检查,看看你是否能分辨出它和背景。它看起来还是白色吗?如果它看起来像是不同的颜色,或者是正在发光,又或者由于后处理而太暗以至于无法看到,那么玩家也会是这样的。
结论
我希望这有助于你了解如何正确使用 post processing(后处理) - 以及为什么 post processing(后处理)确实非常重要。
祝施工愉快!