[2020-01 Update] 于2018年10月,Blender 2.8正式版发布,默认color management即本文提及的Flimic, 应该就是把其整合进 Blender,本文关于 Flimic 使用方法依旧有用。本该一年多前就补充这段话的,当时写这篇博客时就准备了,但抱歉后面完全忘了。

我曾经在我的文章 Blender Cycles渲染作品 面包圈 提到发现一个改进方法,能够大幅提高渲染 render 效果。

本文我会通过上面提及的面包圈作品作为实例,来谈论原生blender dynamic range 动态范围的限制。 以及突破限制的方式,即Filmic Blender插件,最终能带来不可思议的照片级渲染效果。

渲染效果对比 右边改进的作品 提升效果明显

渲染效果对比 右边改进的作品 提升效果明显

这个改进方法我是从blenderguru的一个非常棒的教程视频 The Secret Ingredient to Photorealism学到的。 如果英语还行并且能上U2B,我极力推荐观看。我文章基本就是根据视频整理得出,额外加些我的内容。

另外本文基于blender编写,但是里面相当多的内容并不局限于blender,甚至Filmic的幕后实现也是基于其他领域的成果(下面正文我会介绍)。 所以如果你使用其他CG或者渲染软件,以及别的相关领域也建议了解下。 比如虚幻4 UE4游戏引擎在4.15版本的时候也有类似的新特性 1

What is Dynamic Range

首先从拍照来引入,相机(或手机)取景会显得过亮或者过暗,我们经常会选取图像的某一处作为“曝光点”, 然后镜头会以我们选择的“曝光点”作为 中间灰度值 middle grey 自动调节。

在一些光照复杂的情况,比如烈日户外,我需要拍摄一个阴影处的物体,我们选择暗处作为曝光点, 可能外部天空背景就会显得过亮。当我选择天空作为曝光点,暗处又会显得很暗,甚至一团黑完全看不到东西。

这两种纠结的情况会发生,就是因为相机曝光范围有限制,这个限制范围就是 dynamic range 动态范围

Dynamic Range. 图片来源blenderguru.com

Dynamic Range. 图片来源blenderguru.com

超出 dynamic range 的部分被称为 clipping ,过暗以至于完全黑色的被称作 black clipping , 相反的过亮完全变白的的被称作 white clipping

Clipping 下图红色部分即 white clipping 部分(高光), 另外图中黑色冲压(图中间的柱体)也有 black clipping 的部分 图片来源 wikipedia

Clipping 下图红色部分即 white clipping 部分(高光), 另外图中黑色冲压(图中间的柱体)也有 black clipping 的部分 图片来源 wikipedia

clipping 的部分是超出了感光器材的 dynamic range 产生,但并不是所有情况都是缺陷。有些情况下, 有些地方就因该是高光,比如光滑金属的反光的部分;或者完全的暗部,现实光照就是不足以照亮的角落 。但有时不能接受, 比如我的面包圈之前的效果,其中一处在偏左白色盘子存在 white clipping 问题, 以至无法看出盘子中间是凹的(对比右图)。

笼统说 dynamic range 越宽,效果越好。衡量其范围的单位为 f-stops:

不同的成像设备以及人眼的f-stops。 图片来源blenderguru.com

不同的成像设备以及人眼的f-stops。 图片来源blenderguru.com

上述图中,最好的是人眼,达到了 20 f-stops。最差的便携相机都有 10 f-stops。 而blender,仅有 8 f-stops,甚至连最差的便携相机都不如。

Dynamic Range 如何影响渲染结果

前文一直借用摄像领域的介绍,现在回到blender,谈谈 dynamic range 如何影响渲染的结果。

左边盘子已经出现 white clipping 但是整个场景很多依旧感觉很暗

左边盘子已经出现 white clipping 但是整个场景很多依旧感觉很暗

在左边盘子以及桌面出现大量的 white clipping 的时候, 光源不能继续提高亮度了,但是场景有的部分依旧感觉很暗,比如右边 巧克力面包圈下面的阴影。

blenderguru的教程,其使用的例子也是类似的情况,而且其光照条件更为苛刻。 是在一个基本封闭的室内,只有一扇窗户有采光,当透过这扇窗的直射光找到 其室内的桌子并出现 white clipping 的时候,整个房间别处依旧很暗。 而这间房子,即作者的房间,作者提供一张现实的照片,现实里并不会如此暗, 整个房间还是很明亮的。

这时,有些人会采取一些“作弊”方式来解决,比如添加额外的光源来模拟增强反射光bounce lighting, 或者增强 sky light 来增加室内光线。

但仔细想想 这种做法没有意义! 我们现实世界并不需要“作弊”。

Blender存在这些问题是由于狭窄的 dynamic range 限制:

  • 场景过暗,是由于光源的反射光不足。
  • 光源的反射光不足,是由于光源亮度不够。
  • 光源的亮度不够,是由于光源已经很刺眼了。
  • 光源完全刺眼,是由于 dynamic range 太窄只有 8 f-stops

如果我们能够提高 dynamic range,我们就可以提高光源亮度,这样反射光就会增强, 最终我们就能得到完美的光照效果,而不需要额外的工作量。

Blender Dynamic Range 有限的原因

幸运的是blender的渲染器 renderer 并不存在缺陷,别的 renderer 也有可能出现该问题。 真正问题根源是原生blender使用的 色彩管理配置 Color Management Configuration

renderer 和相机,存储图像数据都是数字格式,当将数字数据显示为图像的时候,是 需要经过转化处理的,就是 色彩转化 color transform

问题的根源 是blender使用了 sRGB color transform。sRGB 是设计来模拟 CRT显示器 的显示效果。 而这本意不是用来渲染的,永远不应该拿来渲染。

解决方式 Filimic Blender

我们只需要将原生的blender的sRGB 改为名为 Filmic Blendercolor management

Filmic Blender是由 Troy Sobotka 编写一套 color management。类似于ACES2Filmic Blender 能够将 8 f-stops 提升至 25 f-stops

Filmic Blender的dynamic range爆表

Filmic Blender的dynamic range爆表

最重要的是Troy非常慷慨将 Filmic Blender 对community开源,并且完全免费。

安装 Filmic Blender

  1. Github项目页面找到 Clone or Download 按钮, 点击后选择 Download Zip 下载zip压缩包。
  2. 解压到blender datafiles 目录下。
    • Windows用户,这个目录处于blender安装目录下,可能是 C:/Program Files/Blender Foundation/Blender/<version>/datafiles
    • Linux用户,/home/$user/.blender/<version>/datafiles。其中 $user 及用户名。
    • Mac用户,进入Resources文件夹后,blender.app/Contents/Resources/<version>/datafiles
  3. datafiles 目录下原来的 colormanagement 改为别的名字(例如 colormanagement_bak)作为备份。
  4. 将改解压的文件夹改为 colormanagement 作为新的颜色管理配置。 注意打开后能看到 looks 以及 luts 这两个文件夹,确保目录结构正确。
  5. 打开blender,进入 Scene 标签,在 Color Management 下点开 View 应该能看到如下图的选项。 其中 Filmic Log Encoding Base 就是我们的主角了。

    Filmic Blender Color Management 菜单

    Filmic Blender Color Management 菜单

使用 Filmic Blender

  • color management下面的 view 选为 Filmic Log Encoding Base
  • look 选为 Base Contrast

    没有选择 None 时候,类似于相片Raw格式,look 中的选项相当于应用一个 lookup table。

  • 在高动态范围下,你可以将场景里面的光源亮度提高,让你的场景拥有足够的光线。

使用 False Color 让场景的曝光度明确可见

以往调整光源的时候往往就是肉眼观察,然后不断尝试感觉差不多了。 但现在Filmic Blender有一个量化工具来辅助, 当 look 设为 False Color,就能够将场景内曝光度可视化,可以根据其来调整光源强度。

该设置下,会用不同颜色表示不同的曝光度:

Value Color
Low Clip Black
-10 EV Purple
-7 EV Blue
-4 EV Cyan
-2 EV Green
0 EV Grey
+2 EV Green
+4 EV Yellow
+5.5 EV Red
High Clip White

白色就是 white cliping,黄色以及红色较亮,黑色就是 black cliping,蓝色以及紫色较暗。

原来的光照

原来的光照

这个是改进前的场景,打不都是绿色,而且曝光最高的部分才黄色级别,所以光线严重不足。

增强亮度后的光照

增强亮度后的光照

改进后,盘子有些反光,然后面包圈上的酱料有少许高光。

最后再将 look 改回 Base Constract,查看下改进后的渲染效果:

改进后的渲染效果

改进后的渲染效果

原先光源数据:主光源15,辅光源5。改进后光源数据:主光源38,辅光源10。 亮度提升了一倍多,场景内光线充足后,我们的渲染效果就闪耀了。

总结

Blender 的 Cycles 渲染器效果非凡,我们通过修正了其color management,最后补足最后缺陷。 使其 PBR3 效果的以正确显示,最终达到照片级的真实效果。

视频大概3月份发布,我也差不多一个月后发现并观看了,并用我的面包圈作品练手。 本来当时做完渲染作品,就想写这篇文章来推荐这个我极大受益的方法, 但拖了4个月,眼看blender 2.8版本就要正式版了,2.8内置类似Filmic的功能,再不写有些内容就快过时了。

虽说即将到来的新版本已经意识到并解决老blender的这个问题,但这篇文章或者上述的教程视频依旧有用, 因为会介绍原理层面(很容易理解),知其所以然。


  1. 4.15发布日志 新的基于ACESFilmic Tonemapping特性以及对应的新的Post Progress后期处理的工具, 如果你用过以前版本,4.15的Post Progress有很大变化,而且相关工作流workflow有些不同,UE4团队有相关新特性的U2B视频教程 Filmic Tonemapper | Feature Highlight

  2. Academy Color Encoding System 是在电影以及电视领域用于管理色彩的工业标准。 此处 Academy 也是奥斯卡奖的那个学院。更多关于ACES介绍浏览 http://www.oscars.org/science-technology/sci-tech-projects/aces

  3. Physically Based Rendering 基于物理现实的渲染