http://tieba.baidu.com/p/3922888163

基于物理的渲染(PBR)是一个近几年时常见诸于各大游戏行业技术交流、游戏开发商公关以及游戏媒体口中的词汇。这个词涵盖内容广泛,定义又十分模糊。目前人们所指的游戏中基于物理的渲染包括不少方面,例如线性空间,镜头模型,HDR等等,内容五花八门,极易让外行误解。本系列科普将重点介绍PBR的核心内容——双向分布反射函数,英语简称BRDF。什么是BRDF?BRDF是用来描述材质表面反射的函数,而更加贴近真实世界的材质效果正是PBR的最主要部分。在本文开头我们先不管BRDF的具体定义,而是通过几个具体例子来一步步深入游戏中PBR的基本理论。以下例子主要是对Siggraph上PBR course的翻译,个人认为这是个非常好的PBR入门介绍。

第一个例子,一杯清澈的水,当光线穿过杯子里的水时只有很少一部分光会被吸收和散射,所以我们能清晰地看到杯子后的物体。

第二个例子,一杯茶,当光线通过茶水时,一部分光被吸收,但是没有光线被散射,光线在茶水中始终保持基本一致的传播方向。所以我们看到的现象是,茶水中映出来背后物体的像变暗了,但依然清晰可见。

第三个例子,在一杯水里加些牛奶,当光线穿过液体时,大量光线被散射,部分被吸收,一部分被散射光线穿过牛奶到达我们眼睛。这种情况下,水杯后物体的像已经基本看不清了,但我们能观察到加入牛奶后液体显现的白色

第四个例子是杯可乐,此时通过液体的光线基本被完全吸收,我们看不到杯子背后物体的像,液体也完全变为黑色。

通过这四个例子我们简单复习了一下什么是散射什么是吸收。在接下来我们将把这种现象类比到两类最常见的材质种类——金属和电介质。
电介质便是那些基本不导电的物体,例如石头和塑料,这些常见的不导电物体都是电介质。我们先以理想光滑表面为例,当光线入射到表面时,一部分被反射,一部分被折射,遵从我们最熟悉的反射和折射定律。

如果是金属的话,折射的那一部分会被立即吸收,只留下被反射的那部分光。

如果是电介质的话,折射的那部分光就不是被吸收了,而是被散射。

现在我们就可以引出漫反射和表面下散射的概念了。如果被折射光进入电介质表面后,在被散射的情况下只“走”了极短的一段距离后就重新进入空气,并向各个方向均匀地散射开来的话,我们称这种现象为漫反射(diffuse),如图中蓝色射线所示。

如果光线在折射后被散射,在物体的表面下传播了一段明显的距离后,又重新从表面下回到空气中,我们称之为表面下散射(也就是常说的3S,很多国内文章翻译为次表面散射,个人觉得不妥)。

最为常见的表面下散射现象就是人的皮肤。

而对于金属,如上文所说,折射的那部分光被吸收,所以金属基本只有高光分量(specular),没有漫反射分量。所谓高光分量此时也很清楚了,也就是入射光被反射后维持一定方向性,较密集地射入空气的现象。下图圆圈中圈起的就是高光分量。

金属的高光往往是带有颜色的,而电介质的反射光一般是白色,也就是入射光是什么颜色,反射光还是什么颜色,这是两种材质的另一个重要区别。

物体表面的粗糙程度决定了高光分量的密集程度,物体表面越粗糙,高光分量越不密集,反射的像也越模糊。所以清晰的反射像和模糊的高光本质上是一个东西。下图从右到左展示了材质表面粗糙度递增的现象以及对应的材质示例。

此外,材质表面越粗糙,高光“覆盖”的范围就会越广,而高光也会越暗,这是一种基本的能量守恒现象。

再来一组直观的例子来演示一下漫反射和镜面反射。下图是一块光源照射下的砖头

下图则是使用偏振镜头拍到的砖头表面的镜面反射分量

下图是偏振镜头拍下的砖头表面的漫反射分量

至此我们就把电介质和金属这两类最主要的材质类型的基本材质现象给介绍完了,那么如何通过数学方式来描述这些材质反射现象呢?这里我们重新引出文章开头提到的BRDF——双向分布反射函数这一概念。BRDF就是一个描述入射光与反射光之间关系的函数,其定义为:

即反射光辐射亮度微元与入射光辐射照度微元的比值。
看不懂?不用担心,其实BRDF代表的是一个非常简单的概念。我们换一种形式来表述,如果,我们称某一方向上的入射光为自变量x,某一方向上的反射光为关于入射光的函数f(x),那么入射光与反射光的关系就是f(x)=k*x,而BRDF就是那个系数k,也就是多少比例的光被反射,仅此而已。只不过在不同的入射方向和反射方向上这个k都不一样,又因为方便测量等种种原因,BRDF被定义为如上形式。

如何得到或算出BRDF并应用到渲染中?我们可以把所有不同方向的入射光和反射光都测好,然后在游戏实时渲染中直接拿来用,但这样做的话数据量太过庞大,显卡吃不消。或者,我们可以从头开始,用基本物理原理精确重建出反射模型,但计算量太过庞大,显卡也吃不消。所以电影和游戏中都采取折中方案,通过一些可以容易测得的参数(贴图),以及相对简单的物理建模来重建表面反射模型,至此关于PBR的第一部分科普结束,下一篇文章中将介绍目前最为流行的BRDF模型理论——微平面理论。

http://tieba.baidu.com/p/3922948521

在第一部分中我们简单地介绍了基本的反射现象并且引入了BRDF这一概念。从这一部分开始我们将简单讲解目前最为流行的BRDF模型——微平面理论模型。
所谓微平面理论,就是把物体表面看作是一系列细小的平面所构成的宏平面,这些微平面我们肉眼不可见,但是又远大于光的波长,如下图所示

下面是一个能更加直观地理解微平面的例子。假设我们有一个如下图所示的粗糙表面

我们将表面上这些纹路的密度提高

再将密度提高

再提高

可以看到这些坑坑洼洼的纹路肉眼已经看不到了,此时它们变成了“微平面”。

每一个微平面都被视作理想镜面,对于计算光线入射理想镜面的反射和折射分量,自然而然地便会拿出菲涅尔公式。菲涅尔公式的具体形式在这里就不写了。我们在这里贴一张不同材质从0度入射角到90度入射角的反射分量曲线图

这里有个重要的现象要注意。在上图中,所有材质在光线平行于表面入射时几乎所有光线都被反射,而当入射角越来越小时,大部分金属依然能反射掉大部分的入射光,而大部分电介质材质都会吸收掉几乎所有的入射光,反射分量迅速下滑。这一现象造成了金属和电介质的不同外观。下图便是电介质的反射示意图,可以发现,越接近下图中球体的边缘,反射强度越高

作为BRDF微平面理论模型的第一个重要部分,我们称之为菲涅尔项(Fresnel Term)。

对于每一个微平面,并不是所有入射光都能到达此处,也不是所有反射光都能直接离开材质表面。原因在于,对于比较粗糙的表面,微平面都是坑坑洼洼高低不平的,一部分入射光和反射光会被其他微平面遮住,下图黑色部分就是被遮住的反射光

再来一张

这一描述有多少入射光和出射光会被遮住的项,我们称之为遮挡项或几何项(Geometry Term)

到此,我们先来整理一下微平面理论下BRDF的概念。还记得上篇我们将入射光和出射光的关系比作简单的f(x)=k*x的例子吗,这里我们可以简单地扩写一下这个式子
某一点在某一方向的反射光 = (几何项1:改点在入射光方向未被遮住的比例)*
(几何项2:改点在反射光方向未被遮住的比例)*
(菲涅尔项:在光滑的理想镜面微平面上反射光的比例)*
D*(某点在某方向上的反射光)
还有一个最后一个D项是什么?首先我们来简单复习一下理想镜面反射的情形。对于一个理想镜面,在满足什么条件下入射光能正正好好射入到我们的眼睛中?答案非常简单,就是在镜面向量正好指向视线向量和光线入射方向的半角向量时,如下图所示。

说到此处D项的意义就非常清楚了:在某一点,有多少比例的微平面的发线方向指向视方向和入射光方向的半角向量,从而能恰好将光线反射到我们的眼睛里。这一项我们称之为法线分布项(Normal Distribution Function,简称NDF)。NDF是最为重要的一项,他与菲涅尔项共同影响高光的衰减程度,同时又决定了高光的形状。

现在我们可以完整地写出在微平面理论下BRDF的形式了,如下所示

注意上式只是高光部分的BRDF,漫反射部分还没写。分子从左至右便是菲涅尔项,几何项和法线分布项,菲涅尔项和其他两项相互独立,三项都能被任意替换,这个模型被称之为Cook-Torrance模型,是目前最为常用的微平面BRDF形式。有人会问分母中的那两项是啥,其中一项的来源是因为,微平面理论定义在半角向量,而在渲染中则是在入射及反射光方向空间计算,需要乘上对应的雅可比行列式变换空间微元。这一项也至关重要,没有的话就无法模拟出一个称之为off-specular peak的现象:对于粗糙材质(尤其是金属),当光线以较大的入射角入射时,反射光最强的方向并不在镜面反射方向。对于微平面理论模型Blinn-Phong便是根据这一现象推导出来的。另一项是则是伴随几何项的修正项,具体推导略过。

简单介绍完微平面理论下BRDF的构成后,我们要开始填入更加具体的式子了。首先对于菲涅尔项,有个很常用的近似称之为Schlick近似,具体式子为:

这个近似有个好处在于电介质和导体(金属)通吃,无需分开来计算。式子中的Cspec便是高光颜色,也就是F0。
几何项受限于篇章,我在此处略去。对于NDF项就比较复杂了,各种模型五花八门,这里我们重点介绍最为常用的三种,Phong,Blinn-Phong和GGX。

Phong是最早也是最简单的一种光照模型(查了下Phong好像是个越南人)。在Phong光照模型下,高光反射永远关于镜面反射方向对称,在平面上其高光形状永远是圆形。如下图所示

Blinn将Phong的V*R改成了N*H,在曲面上Phong和Blinn-Phong很难看出区别,但在平面上,这一简单的改变却使高光形状发生了巨大的变化,使其从正圆形变成了狭长的椭圆形。如下图所示

上图中第一排便是在平面上Phong和Blinn-Phong的差别。Blinn-Phong在平面上所带来的这种椭圆形的狭长高光更加符合现实情况。在孤岛危机1(CryEngine 2)中虽然集成了多种光照模型,但主力模型仍是最为简单的Phong。到了CryEnigne 3,也就是孤岛危机2/3时,Crytek换成了Blinn-Phong模型。不过,使用更高级光照模型的孤岛危机2的材质表现反而被不少人诟病,原因何在?我们将在以后的部分探讨。

从2013年开始,不少次世代游戏开始换上了一种全新的NDF模型——GGX,也称为Trowbridge-Reitz。GGX最大的特点在于,从高光中心处高光相比Blinn会更快衰减,但是在远离高光中心后高光衰减却比Blinn-Phong的衰减要慢得多,这使得GGX的高光远比Blinn-Phong要狭长。GGX的高光有条常常的“尾巴”,这一点非常符合现实情况。尤其对于较为粗糙的材质,GGX的高光有非常柔和的衰减,使得Blinn-Phong/Phong时代“油腻腻”的材质现象大幅减少。
下图为Blinn和GGX在相同粗糙度下的效果对比,左为Blinn-Phong,右为GGX:

下图为Blinn-Phong,Phong,原始Cook-Torrance模型和采用了GGX的Cool-Torrance模型对比,GGX的长高光特性在这里非常明显。

另一个GGX和Blinn-Phong的直接对比。

一组在Cryengine中的对比图。上为CE3.5,使用Blinn-Phong,下为CE3.6,使用GGX。

再以教团1886为例,使用了GGX和更加精确的菲涅尔反射公式后,可以很轻松地做出逆光环境下的rim lighting效果,而在运用PBR前,模拟这类效果的方法一般是同时使用不同的BRDF在多个pass下完成。

GGX可以在和Blinn-Phong差不多的运算量下实现比Blinn-Phong要好得多的效果,这使得GGX迅速成为最为流行的光照模型。虚幻4, Cryengine 3.6开始的版本,教团1886,神秘海域4,寒霜引擎2015年开始的所有游戏等等,都将GGX作为主力光照模型。还有一些游戏在游戏开始制作时使用Blinn-Phong,难以在制作中途换到GGX,就通过修改材质粗糙度的方法来拟合GGX,例如声名狼藉:次子。在模拟多层材质上GGX也有良好的近似效果,Ryse,教团1886,神秘海域4都将GGX作为皮肤的高光模型。下图为Ryse中Marius的人头模型。

相比高光反射,游戏中在漫反射模型方面使用的模型就要简单得多。一般很多游戏直接使用最为简单的Lambertian模型,各个方向的反射光强度均匀,也就是这样:

一些游戏会用到更复杂的漫反射模型,目前比较流行的便是Oren-Nayer模型,Oren-Nayer也是通过微平面理论来描述漫反射的,可以模拟出在光线贴近表面入射粗糙材质时模糊的高光效果,很适合哑光材质。CE3,虚幻4都将Oren-Nayer作为漫反射模型。
讲完了高光反射和漫反射,最后一种材质反射现象便是表面下散射。表面下散射在实时渲染中尚无法精确算出,目前游戏中常使用基于屏幕空间的方法,具体我会在另一篇文章中科普。 
至此,PBR的第二部分科普就结束了。在第三部分中我们将探讨IBL和面光源的问题。

游戏中基于物理的渲染简简明科普相关推荐

  1. 游戏中基于物理的渲染(一)

    "游戏中基于物理的渲染"系列由4-5篇文章组成,介绍了如何在实时渲染中使用基于物理的方法.内容主要来自于SIGGRAPH 2010的course:Physically-Based ...

  2. 游戏中基于物理的渲染

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=493 "游戏中基于物理的渲染"系列由4-5篇文章组成,介绍了如何在实时渲染 ...

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

    基于物理的渲染,通俗一点说就是根据现实环境上光是如何照到物体,然后物体如何把光的颜色反射到人的眼睛的过程,通过渲染表达出来.而游戏中基于物理的渲染就是通过数学公式建模的方式来模拟(只是模拟并非完全准确 ...

  4. (十九)unity shader之——————基于物理的渲染技术(PBS):中篇(Unity 5中的Standard Shader的实现和使用)

    一.unity 5中的standard shader 在unity5中新创建一个模型或是新创建一个材质时,默认使用的着色器都是一个名为standard 的着色器.这个standard shader使用 ...

  5. [图形学] 基于物理的渲染(PBR)

    reference :<real-time rendering 4> BRDF 概述 基于物理的渲染即计算沿着视线进入相机的光照辐射.如果不考虑吸收或散射的介质,则进入相机的辐射等于离开相 ...

  6. (二十)unity shader之——————基于物理的渲染技术(PBS):下篇(PBS技术拓展:全局光照、伽马校正、HDR)

    前面两篇文章我们介绍了PBS实现的数学和理论基础,和standard shader的原理和实现,还有一些其他的渲染相关的unity技术.其中有些概念和技术没有讲的很详细,现在对这些重要的概念进行更深入 ...

  7. 【基于物理的渲染(PBR)白皮书】(二) PBR核心理论与渲染光学原理总结

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处           文章链接: https://zhuanlan.zhihu.com/p/56967462 这是[基于物理的 ...

  8. 【基于物理的渲染(PBR)白皮书】(五)几何函数相关总结

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处           文章链接: https://zhuanlan.zhihu.com/p/81708753 在基于物理的渲染 ...

  9. 基于物理的渲染技术(PBR)系列一

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

最新文章

  1. Linux运行Java出现“Exception in thread main java.lang.OutOfMemoryError: Java heap space”报错...
  2. 江苏关于领取软考2021年上半年合格证书的通知
  3. OpenCV A-KAZE匹配的实例(附完整代码)
  4. BERT+CRF互联网金融新实体发现
  5. 【舆情监控】社会化大数据应用平台TOOM舆情监测系统
  6. UI设计中的“吐司”是什么意思?
  7. Spring Cloud OAuth2 认证流程
  8. 将瀚高数据库表内数据导出Excel格式
  9. NO.3 微信第三方平台代创建小程序审核发布以及小程序信息(头像,名称,简介)修改 以及微信错误码 返回信息
  10. 9-java.sql.SQLException: Incorrect string value: ‘\xE9\x82\xA3\xE5\xB0\xB1‘ for column ‘content‘
  11. 哈尔滨工业大学提出光学设计新思路:基于快速可微光线追迹的端到端单透镜成像系统设计
  12. 安卓蓝牙SCO打开流程
  13. 杀掉window/system32/driver下.sys的流氓文件
  14. 使用python计算水仙花数
  15. 邮币卡如何“做局”? 高回报诱惑下的陷阱
  16. C语言新手入门|初始C语言
  17. 透过敦煌网的IPO,看跨境电商热潮里新老玩家的新一轮交互
  18. uniapp app蓝牙打印_给编程器加装蓝牙串口模块,用手机APP操作打印信息进控制台...
  19. 9与4日晚,冒雨参加3W咖啡的APP广告-流量变现活动
  20. NLP:HMM、MEMM、CRF序列标注

热门文章

  1. python 运行cmd命令失败怎么办_python manage.py runserver命令在cmd命令框中可以正确执行,但是在pycharm的终端中运行就失败了!...
  2. webstorm怎么跑项目_看不懂代码,不会用框架,新手程序员入职后如何快速上手项目?...
  3. ubuntu mysql 5.7 远程_ubuntu16.0.4安装mysql5.7以及设置远程访问
  4. flash.net.filereference php,as3与php 上传单个图片demo
  5. sql int 比较_分享 21 个编写 SQL 的好习惯
  6. reload端口 tomcat_CentOS 7配置tomcat https并改端口为443
  7. oracle anonhugepage,案例:Oracle linux redhat检查Transparent HugePages状态并关闭
  8. mac osx 下的 mysql_Mac OSX下的MySQL数据库升级
  9. JDOM与DOM的相互转换
  10. Java讲课笔记18:异常处理