PBR系列-物理材质(上)

作者:游梦

对PBR系列文章感兴趣还可以看前文:

PBR系列 - 物理光源

PBR系列-光之简史

前面两篇文章分别介绍了物理光源与光学研究简史,在对光有了简单认识之后,再认识物理材质会发现其实本质上还是对光的研究,再深入一点其实就是光在经过物体之后根据光线散射、反射以及折射的不同区分的材质,看完本篇文章,相信你会对物理材质有个新的认知。

可能有小伙伴好奇为什么我介绍到这里还没有介绍渲染方程,这里小编做个解释,一开始小编在学习PBR时,由于没能看到比较系统简单明了的文章,所以在初次看到渲染方程时产生了不小的恐惧心理,因此当小编开始写PBR时没有上来就介绍底层晦涩难懂的渲染方程,采取的方式是先简单大致介绍PBR整套理论,由浅入深,最后介绍渲染方程时会与前置的所有知识点进行联动,有助于清晰直观的理解渲染方程。

小编对物理材质的理解?

先来做个小测试,下面有三张纹路相似的图,分别是什么材质?

(图源:百度图片)

(图源:百度图片)

(图源:百度图片)

这里揭晓答案:

  1. 玻璃

  2. 金属

  3. 布料

简单是很简单,但是如果让你不根据纹理判断,你会用什么来判断?

相信大家都会想到依据光照呈现的效果来判断。第一个后方的物体发射的光线可以穿透被看到,第二个反射的高光效果像金属平面,第三个光线经过细小的线状物体呈现毛茸茸的感觉推断是布料。可以发现都是依据光线经过物体时所呈现的光效判断,所以不同的物理材质也就是在光学研究中对同一类光照呈现效果的命名。

以上是小编对物理材质的理解,如有偏差欢迎指正^_^。

核心理论

在对光线经过的物体研究时,提出了以下几点核心理论:

**微平面理论(Microfacet Theory):**微平面理论是将物体表面建模做成无数微观尺度上有随机朝向的理想镜面反射的小平面(microfacet)的理论。在实际的PBR工作流中,这种物体表面的不规则性用粗糙度贴图或者高光度贴图来表示。

(图源:技术美术知识学习_04:PBR的个人理解_npr流程与pbr流程区别-CSDN博客

**能量守恒(Energy Conservation):**出射光线的能量永远不能超过入射光线的能量。随着粗糙度的上升镜面反射区域的面积会增加,作为平衡,镜面反射区域的平均亮度则会下降。

**菲涅尔反射(Fresnel Reflectance):**光线以不同角度入射会有不同的反射率。相同的入射角度,不同的物质也会有不同的反射率。万物皆有菲涅尔反射。F0是即 0 度角入射的菲涅尔反射值。大多数非金属的F0范围是0.02-0.04,大多数金属的F0范围是0.7-1.0。

(图源:https://blog.csdn.net/qq_17775727/article/details/123284920)

**线性空间(Linear Space):**光照计算必须在线性空间完成,shader中输入的gamma空间的贴图比如漫反射贴图需要被转成线性空间,在具体操作时需要根据不同引擎和渲染器的不同做不同的操作。而描述物体表面属性的贴图如粗糙度,高光贴图,金属贴图等必须保证是线性空间。

**色调映射(Tone Mapping):**也称色调复制(tonereproduction),是将宽范围的照明级别拟合到屏幕有限色域内的过程。因为基于HDR渲染出来的亮度值会超过显示器能够显示最大亮度,所以需要使用色调映射,将光照结果从HDR转换为显示器能够正常显示的LDR。

**物质的光学特性(Substance Optical Properties):**现实世界中有不同类型的物质可分为三大类:绝缘体(Insulators),半导体(semi-conductors)和导体(conductors)。在渲染和游戏领域,我们一般只对其中的两个感兴趣:导体(金属)和绝缘体(电解质,非金属)。其中非金属具有单色/灰色镜面反射颜色。而金属具有彩色的镜面反射颜色。即非金属的F0是一个float。而金属的F0是一个float3,如下图:

(图源:【PBR系列一】PBR知识体系_非金属的f0-CSDN博客

材质渲染工作流

为了能够在图形学中实时模拟计算出材质效果,当前主流的渲染分两种:金属/粗糙度工作流(Metal/Roughness)和镜面反射/光泽度工作(Specular/Glossiness),各自分别有自己的一套参数定义,这里小编介绍最常见的迪士尼基于金属/粗糙度工作流(Metal/Roughness)提出一套参数定义。

(图源:技术美术知识学习_04:PBR的个人理解_npr流程与pbr流程区别-CSDN博客

据说是被美术设计师提醒,美术师需要的光照模型是可控制的视觉正确模型,不一定需要物理正确。所以迪士尼专家建立一个有"原则"的模式,而不是严格的物理正确模型。

迪士尼设计原则:

1.应该使用直观而非物理参数。

2.应该尽可能少地使用参数。

3.参数应该在合理控制在0到1之间。

4.参数应该被允许超出他们合理的视觉范围。

5.所有参数组合应该尽可能的健壮和可信。

参数:

baseColor:表面颜色,通常由texture maps提供

subsurface:用次表面控制漫反射颜色

metallic: 金属度(0电介质-1金属)这是两种不同模型之间的线性混合,该金属模型没有漫反射成分,有一个带颜色的高光,等同于其基本颜色。

specular: 入射高光反射量,代替了折射率。

specularTint:给美术设计师让步而设计的朝basecolor的入射高光颜色,平射角的高光色彩仍然是无色的。

roughness:表面粗糙度,控制漫反射和高光效果。

anisotropic: 各项异性,各项异性的程度,控制高光的宽高比(0 =各向同性,1 =最大各向异性。)。

sheen:一种额外的平射角组件,主要用于布料材质。

sheenTint:基本颜色的色彩光泽量。

clearcoat:第二特别专用的高光页(specular lobe)。

clearcoatGloss:控制clearcoat的光泽度,(0 ="光滑"外观,1 ="gloss"的外观)

下面是各参数影响的视觉效果:

(图源:离线渲染|Physically Based Shading at Disney:Disney principled BRDF - 知乎

下面配图解释光线与物体作用示意图,加深理解光线与不同材质会有哪些效果:

光与非光学平坦表面的交互原理

光在与非光学平坦表面(Non-Optically-Flat Surfaces)的交互时,非光学平坦表面表现得像一个微小的光学平面表面的大集合。表面上的每个点都会以略微不同的方向对入射光反射,而最终的表面外观是许多具有不同表面取向的点的聚合结果。

(图源:【PBR系列一】PBR知识体系_非金属的f0-CSDN博客

在微观尺度上,表面越粗糙,反射越模糊,因为表面取向与整个宏观表面取向的偏离更强。图片顶部所示的表面,表面相对光滑; 表面取向仅略有变化,导致反射光方向的微小变化,从而产生更清晰的反射。 图片底部所示的的表面较粗糙; 表面上的不同点具有广泛变化的方向取向,导致反射光方向的高度变化,并因此导致模糊的反射。 注意,两个表面在肉眼可见尺度下看起来都是光滑的,粗糙度差异仅在微观尺度上。

出于着色的目的,我们通常会去用统计方法处理这种微观几何现象,并将表面视为在每个点处在多个方向上反射(和折射)光。

(图源:https://blog.csdn.net/qq_35312463/article/details/108055143)

从表面反射出的光的行为很好理解,那么,从表面折射的光会发生什么变化? 这取决于对象本身的特性:

  • 对于金属,折射光会立刻被吸收 - 能量被自由电子立即吸收。
  • 对于非金属(也称为电介质或绝缘体),一旦光在其内部折射,就表现为常规的参与介质,表现出吸收和散射两种行为。

(图源:https://blog.csdn.net/qq_35312463/article/details/108055143)

上图是在金属中,所有折射的光能立即被自由电子吸收。

(图源:https://blog.csdn.net/qq_35312463/article/details/108055143)

上图在非金属中,折射的光会进行散射,直到从表面重新射出,就像光照向塑料材质上,能看到光传进物体一样,如下图,光透进兔子头部位再从表面射出的效果。

本篇文章介绍了物理材质、光线作用以及相关物理现象,下一篇将着重介绍光线与物体表面作用的BxDF之间的关系。

参考链接:

离线渲染|Physically Based Shading at Disney:Disney principled BRDF - 知乎

【PBR系列一】PBR知识体系_非金属的f0-CSDN博客

技术美术知识学习_04:PBR的个人理解_npr流程与pbr流程区别-CSDN博客


关注Mapmost,持续更新GIS、三维美术、计算机技术干货

Mapmost是一套以三维地图和时空计算为特色的数字孪生底座平台,包含了空间数据管理工具(Studio)、应用开发工具(SDK)、应用创作工具(Alpha)。平台能力已覆盖城市时空数据的集成、多源数据资源的发布管理,以及数字孪生应用开发工具链,满足企业开发者用户快速搭建数字孪生场景的切实需求,助力实现行业领先。

欢迎进入官网体验使用:Mapmost------让人与机器联合创作成为新常态

相关推荐
冷眼看人间恩怨4 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
星河梦瑾8 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
Hejjon10 小时前
SpringBoot 整合 SQLite 数据库
笔记
长潇若雪10 小时前
《类和对象:基础原理全解析(上篇)》
开发语言·c++·经验分享·类和对象
m0_7482343410 小时前
webGL硬核知识:图形渲染管渲染流程,各个阶段对应的API调用方式
图形渲染·webgl
每日出拳老爷子10 小时前
【图形渲染】【Unity Shader】【Nvidia CG】有用的参考资料链接
unity·游戏引擎·图形渲染
志-AOX12 小时前
C语言入门指南:从零开始的编程之路
经验分享
WANGWUSAN6612 小时前
Python高频写法总结!
java·linux·开发语言·数据库·经验分享·python·编程
西洼工作室12 小时前
【java 正则表达式 笔记】
java·笔记·正则表达式
初学者7.12 小时前
Webpack学习笔记(2)
笔记·学习·webpack