基于物理渲染(PBR)的基础理论

By Jeff Russell 翻译 唐雨轩

八猴官方英文原文

PBR是近来一个新的,有意思的实时渲染方式。这个术语已经被传播得很广泛,但他的真实含义往往是混淆的。简单的回答是:这意味着很多。或者:这得看情况。这种回答并不能使人满意。所以我尝试着将PBR的真实含义,和它与传统的流程详细的解释清楚。这个文档主要是针对美术人员而非工程师。不会涉及数学或者代码类的东西。
PBR和传统流程最主要的区别在于他更详细和科学的还原了光照和物理表面的关系原理。他的纹理系统已经大大的进化。而旧的生产流程和近似的表达方式可以安全的抛弃了。这代表着无论是工程师还是美术工作人员都需要理解这些变化的动机在哪里。
我们需要从一些最基础的东西开始。这样我们可以在讲一些新东西之前对一些基本的概念有清楚的认识。你可能会觉得我讲的这些部分太枯燥乏味,但读过之后你会知道这些东西是值得的。你也可以了解一下Joe Wilson的文章:creating PBR artwork(http://www.marmoset.co/toolbag/learn/pbr-practice)。

Diffusion和Reflection(散射和反射)

Diffusion和Reflection。也被叫做diffuse和specular。是描述光和物体表面互相作用的最基础的两个术语。很多人知道他们在实际应用中是怎么样的。但并不知道他们的物理原理是什么。
当光照射到物体的表面时,他会反射一部分,或者说反弹一部分。从表面的一边反弹到镜像的另一边。就像一个球打在地面上并弹起来一样。在光滑的表面上,会有像镜子一样的效果。单词specular,就是用来描述这种现象的。而specular正是拉丁语中镜子的意思。
然而并不是所有的光线都会从表面直接反射。有些光线会在进入被照射物体的内部。这些进入物体内部的光线有的会被物体吸收(往往会转变为热量消耗掉),而有些散射光线会在物体内散射后又从表面散射出去。然后被我们的肉眼或者摄像机看到。像diffuse,diffsion,3S(SSS)等都是表达的这个物理现象。

对不同波长的光,它的反射和吸收的量是差别很大的。这就让物体有了固有的颜色(例子:如果白光照射在物体上,大部分的光线都被吸收掉了,而只反射出蓝色,那这个物体就是蓝色的)。 这种散射是均匀而散乱的往各个向散射过去的。这和镜面反射完全不同。我们在shader上用”albedo”来表达这些散射颜色。Diffuse color 是和这个同义的短语。

Translucency 和 Transparency(半透明和全透明)

有时候diffuse是蛮复杂的。在有些材质中,散射的距离会更广,更远。比如说像皮肤或者蜡这些材质。这时候用一个简单的颜色来表示是不够的。引擎会要计算物体的形状或者厚度。如果物体足够薄,就可以看到光从物体的背面照射出来(就好像光穿过人的手),这就是translucent(半透明)。如果散射更低,比如说玻璃,几乎所有的光线都直接穿过,以至于你可以看到背面的图像。这些属性都和“物体表面的散射”相去甚远。这时引擎需要一个单独的shader来模拟这些现象。

Energy Conservation(能量守恒)

有了这些描述后我们就有足够的信息去得到一个重要的结论:散射diffusion和 反射reflection是相互排斥的(要么就散射,要么就反射)。这是因为:如果光要散射,他就必须要在物体表面内传播,也就是不能反射。这就是照明系统中的“能量守恒定理”:从一个物体表面散射或反射的光线永远不会比原本照射他的光线要亮。

这很容易被引擎执行:在diffuse执行之前先把反射的那部分光线减去。这意味着高反射的物体的diffuse会很少很黑,因为大部分的光线都被反射掉了,几乎不能在物体的表面散射。下面这种守恒也是同样成立的:如果一个物体有非常亮的diffuse,那他也不会有什么反射。

这种能量守恒是PBR的一个重要的部分。这让艺术家能够基于物理的原理来调整albedo和reflective的值,而不是违背物理原理(这往往会看起来很low很糟糕)。虽然严格的执行这些规律和创造屌炸天的艺术作品并没有什么必然的联系。但它能起到一个“物理学保姆”(比喻)的角色。这能保护你的作品不会偏离规律太远。或者在不同的光照条件下得到前后矛盾的效果(不同光照下的表现相差很多)。

Metals(金属)

导电材料,尤其是金属。值得在这里特别的提出。因为下列的原因:
1、首先,导体(金属)会比绝缘体(非金属)的反射要高的多得多得多。导体一般会反射高达60-90%的光线,而绝缘体会少得多,一般在0-20%的范围内。这种高反射避免了光线进入到物体表面内部散射,给金属一种光亮的效果。
2、其次,导体的反射有时会在可见光谱中变化,这意味着他们的反射是有颜色倾向的。这种反射颜色在不同的导体上也是不同的。比如说:金,铜,黄铜,都是不一样的。而绝缘体不会有这种现象,他们的反射是不带颜色的(一般是某种深度的灰色的)。
3、最后,导体一般会吸收没有反射的光线,而不是在表面散射。这个规律意味着金属是没有diffuse颜色的。但是注意:在现实情况中,金属表面会有一些物体(比如灰尘)和氧化物会产生一些固有色。

这是金属和非金属的两个不同属性。导致一些渲染引擎会有一个直接的metalness通道来区分金属和非金属。在这些引擎中,艺术家会指定一个材质的金属值,或者是用albedo和specular(文中用的reflective反射)来表明。这会让创建材质变的更加的简单,但这并不是PBR的一个必须的部分。

Fresnel 菲涅尔

奥古斯丁菲涅尔是一个我们不能忘记的老人。主要是因为他第一个准确的描述了菲涅尔这个现象。如果我们要谈论光线的反射,那就绕不开这种现象。

在计算机图形学中,菲涅尔指的是在不同角度下,反射的变化现象。特别是:光在一个小掠角射到一个表面的反射会比垂直照射到一个表面要多得多。这意味着一个有着正确菲涅尔效果的物体,在它的边缘位置反射会比中间位置的反射会强很多。我们已经对这个效果很熟悉了,而在计算机图形学领域中,菲涅尔也不是一个新词。不过,PBR系统对菲涅尔方程式做了几个重要的修正。

首先,对所有的材质,在很小的角度看,反射都会很强烈。在极为边缘或者小角度的地方,任何材质都会反射得像一面镜子一样。是的,任何材质,只要平滑,并从对的角度观察,都会像是一面完美的镜子。这有违常理,不过实际上就是这样子的。

第二个有关于菲涅尔属性的结论是。不同的材质之间,菲涅尔曲线的变化差异并不大。金属的差异大一些,但也还是可以分析和记录的。

那这对于我们意味着,获得一个真实的效果。艺术家应该更少的控制菲涅尔属性,而不是更多的控制它。至少,我们应该知道将默认值设置在哪里。

这是一个好消息,因为这会简化内容生成。引擎现在可以自己自动控制几乎所有的菲涅尔效果;它只需要从一些已经预设好的材质属性(比如说gloss和reflectivity)来自动得到就好了。

PBR会根据艺术家指定的基础值(albedo和specular)来确定一个基本的反射值。这个值定义了最小的反射量和反射颜色。菲尼尔效果会从这个艺术家指定的最小的值,一直提升到100%(掠角角度)。一旦艺术家提供了基础值,菲涅尔公式将会自动其余所有角度的反射变化。

这里有个关于菲涅尔效果的警告。在一个表面越粗糙的时候,菲涅尔效果会越明显。下文会讲述更多的关于这方面的信息。

Microsurface 微表面

以上对于反射(reflection)和漫反射(diffusion)的描述都是是基于物体表面朝向的。从一个正常的观察尺度来说,这种表面朝向是基于物体的形状的。而法线贴图也会在描述更加小一些的形状细节。渲染引擎能基于这些信息来渲染diffuse和reflection信息。

但是这里还有一个很大的部分被忽略掉了。大部分真实世界的表面都有很多不完美的地方:小凹槽,破损,小突起等细节。这些细节肉眼是看不到的。正常分辨率的法线贴图也不能体现这些小细节。虽然不能被肉眼看到,这种小细节仍然会对光的diffsion和reflection产生影响。

微表面的细节影响最显著的是反射(次表面散射影响不明显,所以我们不会在这里过多的讨论)。从上面的图我们可以看到平行光线照射到粗糙的表面后会分散的反射开来,因为每一束光和表面碰撞的方向都是不同的。我们用球碰墙的模拟,在一个类似于崖壁或者类似的不平整的表面:当球打到一个表面时,反弹的角度是不可预期的。简单的讲,越是粗糙的表面,越多的反射光线会分散,呈现一种模糊的效果。

可惜的是。定义每一个不同的微表面是不实际的。因为工作流程,内存控制,计算量都做不到。那么咋整呢?我们可以不用直接描述每一个不同的微表面。而是定义一个大概的粗糙程度。那样我们也可以获得一个十分接近而准确的效果。这种值往往叫做Gloss,Smoothness,或者Roughness。你可以通过贴图定义他们,或者给不同的材质定义不同的值。

微表面的细节是一个材质的重要组成部分。因为在实际生活中有大量的,广泛的,不同的微表面特征。光泽度贴图(gloss mapp)不是一个新的概念。但它还是在PBR渲染中扮演了重要的角色。因为微表面细节对光的反射有重大的影响。下面我们马上会讲到PBR系统对微表面属性的若干方面的提升。

Energy Conservation(Again )能量守恒 (再次)

当我们将微表面细节纳入到我们的渲染模型,然后准确的散布反射光线。这时就必须正确地反射光线的量。遗憾的是,很多老的渲染引擎都把这个部分搞错了,基于微表面的粗糙度,不是反射过多就是反射过少。
当方程式准确平衡的时候,一个引擎需要将粗糙表面的高光变得模糊,而将光滑的表面的高光变得小而尖锐。在亮度上的不同表现关键在于:两种材质(光滑和粗糙)都会反射同等量的光线,不过粗糙的表面将它散射到不同的方向,而光滑的表面会变得更加的集中。

这样我们就有了第二种能量守恒需要维持,在加上之前讲过的diffussion /reflection守恒。将这个搞对是所有的PBR引擎最重要的点。

All Hail Microsurface 微表面万岁

有了上面的知识我们就可以了解到:微表面光泽度直接影响了反射亮度的表现。这意味着艺术家可以直接在光泽度贴图直接绘制不同的变化:划痕,凹痕,磨损,磨光,等等。于此同时PBR系统不仅会改变反射的样子,也会相应地改变亮度。再也不需要“spec蒙版”“反射贴图”变化了!

这意义重大。因为这两个真实世界中的量是基于物理相关的——微表面细节和反射度——现在第一次在艺术领域和渲染流程中被准确地联系在了一起。这十分像我们之前讲的diffusion/reflection平衡:我们可以独立的制定两个独立的值,但一但我们将它们联系起来,分别的区别它们就会变得更加的困难。

进一步说,显示世界中的材质的反射值的变化不会很大(参见之前我们讲的关于导体的部分)。一个很好的例子是水和泥巴。都有相似的反射率,但是泥巴是十分粗糙的,但它上面的积水却很光滑,它们因为反射性不同的原因而看起来十分的不一样。在PBR系统中,艺术家主要通过gloss或者roughness贴图来区别这种不同。而不是调节反射率:就像下面一样。

微表面属性在一些其余的细节中也会影响反射。比如说:“边缘会更亮”的菲涅尔效果会在粗糙的表面减小(无序的自然地粗糙表面会打撒菲涅尔效果,而让观察者不能清楚地看到菲涅尔效果)。进一步说,大的或凹陷的微表面特征会“吸收”光线。因为它会在微表面的细节中反射数次,增加了光线的被吸收和减弱。不同的渲染引擎用不同的方法和范围处理这些不同的细节。不过对于粗糙表面的衰减处理方式都是基本一致的。

Conclusion 结论

这里当然有更多需要讲的,关于PBR的内容。这个文档只是一个基础的介绍。如果你还没有十分了解,你可以看下Joe Wilsion的教程 Creaing PBR artwork。(http://www.marmoset.co/toolbag/learn/pbr-practice)如果你想知道更多的技术信息,我推荐你看下面的几篇文章:

John Hable’s excellent blog post: Everything Is Shiny
(http://filmicgames.com/archives/547)

John Hable’s even better blog post: Everything Has Fresnel
(http://filmicgames.com/archives/557)

Sébastien Lagarde’s summary of Rendering Remember Me
(http://www.fxguide.com/featured/game-environments-parta-remember-me-rendering/)

Come to think of it, all of Sébastien Lagarde’s Blog is good stuff
(http://seblagarde.wordpress.com/)

The SIGGRAPH 2010 course on PBR
(http://renderwonk.com/publications/s2010-shading-course/)

Always worth mentioning: The Importance of Being Linear
(http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html)

如果还有什么困难的问题我没有解答的,我在twitter上等你唷~
(https://twitter.com/j3ffdr)

译者 雨轩 QQ 910071006

八猴PBR原理文档熟肉。PBR原理了解必备。相关推荐

  1. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  2. 如何写好文档之金字塔原理

    前言 大部分技术文档的作者不是作家,甚至不是文科生,而是技术工程师.这类人在文字表达技巧上通常比较欠缺,但是有一个显著优势,那就是逻辑思维能力强.对于写作来说,这一点非常重要.尤其是技术文档的写作,必 ...

  3. jQuery文档初始化函数原理

    在jQuery的脚本使用中,经常注册文档初始化函数,比如:$(function(){}); 那么这句话原理是什么呢? 原理一.把completed函数注册到文档加载的原生事件中 关键在这一句docum ...

  4. 语音识别算法原理文档整理(三)

    语音识别系统kaldi 相关原理介绍 Kaldi是一个非常强大的语音识别工具库,主要由Daniel Povey开发和维护.目前支持GMM-HMM.SGMM-HMM.DNN-HMM等多种语音识别的模型的 ...

  5. 【文档熟肉】spring cloud官方文档の中文熟肉之eureka

    下面会陆续开始spring cloud中文文档的更新工作. 先更新个spring cloud最关键的eureka吧,原文地址: https://docs.spring.io/spring-cloud- ...

  6. 超经典!国际著名计算机教育推动者发表计算机原理文档,面面俱到

    "一切应该尽可能简单,但也不能过于简单."--爱因斯坦 尽管要写出一本能够同时满足电子工程系.电子与计算机工程系和计算机科学系的教材几乎是不可能的,但本书进行了有效的折中,它为电子 ...

  7. 转一篇写的比较好的camera文档[Camera 图像处理原理分析]

    色彩篇(一) 1         前言 做为拍照手机的核心模块之一,camera sensor效果的调整,涉及到众多的参数,如果对基本的光学原理及sensor软/硬件对图像处理的原理能有深入的理解和把 ...

  8. 如何解决html文档无法复制,职场必备技能:网页文档无法复制,3招教你轻松搞定...

    原标题:职场必备技能:网页文档无法复制,3招教你轻松搞定 其实很多人在浏览网页时都会遇到这个问题,看到了自己喜欢的文章片段,某一段文字特别符合自己的工作汇报,想要复制下来,结果却发现弹出了窗口,不是让 ...

  9. 写实风格头发建模,八猴这个功能杠杠的!次世代建模必备

    什么是写实风格的建模?一个字形容:真!而这也正是次世代建模的真谛. 次世代的制作流程:3Dmax建中模,ZB雕刻高模,maya拓扑低模,mayaUV拆分,toolbag或SP烘焙贴图,SP绘制材质,八 ...

最新文章

  1. c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
  2. PyTorch 实现经典模型4:GoogLeNet
  3. Popupwindowdemo
  4. Android View 的滑动
  5. 【JS 逆向百例】Fiddler 插件 Hook 实战,某创帮登录逆向
  6. 《数据挖掘导论》绪论
  7. 主力吸筹猛攻指标源码_成功率90%以上【主力吸筹+买点提示+使用方法】通达信指标公式源码...
  8. 核磁共振测井设备市场现状及未来发展趋势分析
  9. Python beautiful soup解析html获得数据
  10. 51驱动AD9850/AD9851—DDS信号发生器
  11. Robot Framework installation not found. To run tests, you need to install Robot Framework separately
  12. 扣哒世界发布面向中小学阶段C++信奥课程体系
  13. 前端ppt\word等等文件实现在线预览功能
  14. 随机生成20个手机号码
  15. Firecracker
  16. 谷歌命令行解析工具gflags的使用
  17. 达梦数据库企业管理器(DEM)搭建
  18. 化学专业计算机课程设计,课程设计总结
  19. 简单封装的Stripe支付方法
  20. Jungo WinDriver

热门文章

  1. 基于OpenGL与手绘系统的盆栽植物生成及其风动动画
  2. 佳能eosr5和r6区别 佳能eosr5和r6价格
  3. 当你迷茫时你是怎么走出困境的?
  4. 基于java+ssm+mysql的高校心理咨询预约系统
  5. sharesdk分享失败404_shareSDK微信分享图片url识别失败
  6. 前端,是一种GUI软件
  7. 新AI时代序幕已拉开 不信请看这十四大例
  8. 大多数面试官都会问的一个问题,这样答就能轻松过关
  9. c# mysql executenonquery_C#与数据库访问技术总结(八)之ExecuteNonQuery方法
  10. 请问在北京华为工程师的年收入