作者:idovelemon
日期:2018 / 1 / 1
来源:CSDN
主题:PBS, Microfact Theory, Cook-Torrance
引言
近些年来,基于物理的光照着色系统(Physical based shading)越来越流行。主流的渲染器,游戏引擎都支持了这种着色方式。相比于以前的Phong和Blinn-Phong的光照着色模型,这种着色方式更加真实,也更加容易适应不同场景。接下来的几篇文章,我将从实现的角度分析如何设计实现一个这样的光照系统。主要仿照Unreal4的实现方式来进行实现。
基于物理的着色
那么,在我们进行实际的编码之前,先大致的了解下什么是基于物理的着色。所谓基于物理的着色,就是根据物理世界中光与材质的交互方式,近似的提出一种方案来模拟这种效果。读者需要注意,这种方式是“基于物理的”,并不是“物理精确的”。它不是真实的再现现实世界中光与物质的交互,而是把握它们交互的主要特性,通过数学近似的方法来模拟。一个基于物理的着色,需要有如下三个基本的条件:
1.基于微表面理论建模的反射模型
2.能量守恒
3.基于物理的BRDF
(除此之外,还有什么相互性等等,不过本篇文章主要关注以上三个条件)
渲染方程
我们接下来的实现,将主要围绕一个方程来展开。这个方程总结了想要渲染出一个场景的一般性步骤,这个方程称为渲染方程(针对于实时渲染来说,又可以称之为反射方程):
下面简要的介绍下公式中每一个部分的意思:
Lo :表示的是经过着色之后,从 wo 方向观察点 pi 时的颜色
f(pi,wi,wo) :表示的是点 pi 上,从 wo 方向反射出去的光照与从 wi 方向的入射的光照的比值,该函数称为BRDF(Bidirectional Reflection Distribution Function)
Li(pi,wi) :从 wi 方向入射到 pi 点上的光照
n⋅wi :表示的是光照的反射强度与光照方向与接受光照表面法线方向之间角度的关系,即Lambert Law
∫Ω…dwi :表示的是在点 pi 法线方向上的半球,所有入射光线方向的积分
光与材质的交互
当一束光线照射到材质表面的时候,会分成两个主要的部分,反射的光线和折射的光线。
对于折射的部分,由于物质本身的特性,一部分会被吸收,一部分会在物质本身的粒子之间来回碰撞,直至又从物体表面反射回去。
从物体内部再次反射出去的光线,是不规则的。想要精确的模拟这种情况,需要用到次表面散射的技术(Subsurface scattering)。引入这种技术,需要非常复杂的计算,消耗过多,所以业界一般使用漫反射(Diffuse)来进行模拟。
所以,当处理一束光照射到物质表面的时候,需要分成了两个不同的反射部分进行处理,分别是漫反射和镜面反射。所以渲染方程就变成了如下的形式: