本篇融合个人实战心得,细致剖析方程结构,深入浅出地阐释每个参数的实质意义,力求为您的图形学探索之路扫清障碍,攻克渲染方程这一核心难关。
学习渲染方程,您需要奠定以下基础:
-
物理光源:了解如何以数学来模拟现实中的光量。
-
[辐射度量学
看到这里可能有小伙伴会产生退却心理,那么就更不要错过本文,文章里会详细拆解方程,即使数学基础
欠缺也能读懂渲染方程,虽然初学阶段对数学基础要求不是太高,但是建议先完成如下几篇阅读:
辐射度量学:
PBR(基于物理渲染):blog.csdn.net/qq_53352162…
一、渲染方程构造
渲染方程构造,图源:Mapmost SDK for WebGL
- **自发光:**只有当前对象是光源时,才会存在
- **反射结果:**只是泛称,是周围所有射向当前像素所在点的物体的光线,经过反射、折射、散射等结果的求和
在学习PBR(基于物理渲染时),经常看到BRDF(双向反射分布函数
),就对应方程中的:
渲染方程中BRDF部分,图源:Mapmost SDK for WebGL
根据不同材质,有不同的函数方程
,目前常见的有BRDF(双向反射分布函数)、BSDF([双向散射分布函数
](zhida.zhihu.com/search?cont…
最常见的BRDF适用于不透明物体的渲染,它假设:光线只在物体表面发生吸收、反射,且出射点和入射点相同,并定义:某一点出射到相机方向的radiance,等于以这个点为圆心的上半球面所有方向的入射光反射到相机方向的radiance之和,参考下图:
光线与物体表面反射示意图,图源:zhuanlan.zhihu.com/p/672819249
以BRDF为例,方程可进一步写入如下方式:
渲染方程中构造拆解示意,图源:Mapmost SDK for WebGL
这个方程中有许多的字符,正是让许多初学者退却的点,这里给大家提供一个字符解释表格:
渲染方程构造,图源:Mapmost SDK for WebGL,注:漫反射系数 + 镜面反射系数 <= 1
相信通过上面表格的详细拆解,大家对方程的恐惧感消除许多,表格中最重要的是D、F和G三个,相信许多人在许多讲解PBR(基于物理渲染
)文章里常见到这三个字符,却不知道三个函数**怎么用?以及用在什么地方?**这里给大家逐个介绍:
值得注意的点是,很多厂商对D、F、G都有自己的解法,并不是唯一的,原因是一个方程有不同解法,有追求渲染逼真的解法,有做风格化的解法,还有追求性能近似简化的解法,就比如光照模型
,初学者最先接触的都是最简单的Blinn-Phong模型,因为其代码简单且有很好的近似效果。
-
**BRDF-D([法线分布函数
该函数是建立在微平面理论
之上,用于对不同粗糙度的表面给出光线反射到相机的强度,所以参数是表面法线、法线与入射光线的半角向量以及粗糙度,返回的是float类型。
常见法线分布方程,图源:Mapmost SDK for WebGL
-
BRDF-F(菲涅尔):
常见菲涅尔方程,图源:Mapmost SDK for WebGL
-
BRDF-G(自遮挡):
自遮挡示意图,图源:Mapmost SDK for WebGL
- 入射光部分:
-
漫反射部分:
F0和F90分别是0°和Grazing Angle的折射率。
下图是一些常见物质的F0,可以发现金属的F0比非金属高很多。即使是铁,也能在0度反射超过50%的光。非金属的F0大部分都很小,实时渲染
中一般都取一个常量0.04,[虚幻引擎
](zhida.zhihu.com/search?cont…
](zhida.zhihu.com/search?cont…
常见材质的F0数值,图源:zhuanlan.zhihu.com/p/294789356
现在的实现中一般会用BaseColor和Metallic两个参数,对于金属BaseColor表示F0,对于非金属BaseColor表示漫反射颜色,因为金属没有漫反射,所以材质的Diffuse(albedo)和F0计算如下:
Diffuse = BaseColor.rgb * (float3(1.0, 1.0, 1.0) - NoMetalF0) * (1.0 - Metallic);
F0 = lerp(NoMetalF0, BaseColor.rgb, Metallic);
本文章适合刚学习渲染方程的人,因为没有晦涩难懂的各种数学公式,使用最直白的表达,如果数学功底好的且想深究其积分方程
解法推荐阅读这篇:zhuanlan.zhihu.com/p/564814632
至此渲染方程对单条光线的计算过程拆解完成,实际应用中都用到了环境贴图(IBL)进行模拟全局光照
,下篇我们会讲解IBL的拆解,敬请期待~
点击此处前往Mapmost官网体验!