我们是如何看到这个世界的
我们要模拟真实的光照环境来生成一张图像,需要考虑三种物理现象。 1.首先,光线从光源(light source)中被发射出来 2.光线和场景中的一些物体相交:一些光线被物体吸收,另一些光线散射到其他方向 3.最后,摄像机吸收了一些光,产生了图像
光源
光是由光源发射出来的。在实时渲染中,我们通常把光源当成一个没有体积的点,用l来表示它的方向。在光学里,我们用辐照度(irradiance)来量化光。
吸收和散射
光线由光源发射出来以后,就会与一些物体相交。通常,相交的结果有两个:散射(scattering)和吸收(absorption) 散射只改变光的方向,不改变光的颜色和密度。吸收只改变光的颜色和密度,不改变光的方向。光在物体表面经过散射后,有两种方向:一种会散射到物体内部,即折射(refraction)或透射(transmission);另一种会散射到外部,即反射(reflection)。 为了区分这两种不同的散射方向,我们在光照模型中使用了不同的部分来计算它们:高光反射(specular)部分表示物体表面是如何反射光线的,而漫反射(diffuse)部分则表示有多少光线会被折射,吸收和散射出表面。根据入射光线的数量和方向,我们可以计算出射光线的数量和方向,通常使用出射度(exitance)来描述它。辐照度和出射度之间是满足线性关系的,而它们之间的比值就是材质的漫反射和高光反射属性。
着色 / 光照模型
着色(shading)指的是,根据材质属性(如漫反射),光源信息(如光源方向,辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程,这个等式也叫做光照模型(Lighting Model)。不同的光照模型有不同的目的,一些用于描述粗糙的物体表面,一些用于描述金属表面。
BRDF光照模型
在图形学中,BRDF(Bidirectional Reflectance Distribution Function)大多使用一个数学公式来表示,并且提供了一些参数来调整材质属性。通俗来讲,当给定入射方向和辐照度后,BRDF可以给出在某个出射方向上的光照能量分布。
标准光照模型
标准光照模型只关心直接光照,也就是那些从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。
它的基本方法是,把进入到摄像机的光线分为四个部分,每个部分使用一种方法来计算它的贡献度:
自发光(emissive)
当给定一个方向时,一个表面本身会向该方向发射多少辐射量。cemissive = memissive
高光反射(specular)
当光线从光源照射到物体表面时,该表面会在完全镜面反射方向散射多少辐射量。cspecular = clight·mspecular max(0,
v
^
\hat{v}
v^·r)m~gloss~ 其中, mgloss 是材质的光泽度,也被称为反光度,用于控制高光区域的亮点有多宽,mgloss 越大,亮点就越小 mspecular 是材质的高光反射颜色,用于控制该材质对于高光反射的强度和颜色 clight 是光源的颜色和强度
漫反射(diffuse)
当光线从光源照射到物体表面时,该表面会向每个方向散射多少辐射量。cdiffuse = clight·mdiffuse max(0,n·1)
环境光(ambient)
用于描述其他所有的间接光照。cambient = gambient
逐像素还是逐顶点
通常来讲,我们计算基本光照模型有两种选择:在片元着色器中计算,也称逐像素光照;在顶点着色器中计算,也称逐顶点光照
在Unity中实现漫反射光照模型
基本光照模型中漫反射部分的计算公式: 要计算漫反射需要4个参数: 入射光线的颜色和强度clight,材质的漫反射系数mdiffuse,表面法线
n
^
\hat{n}
n^,光源方向 I
为了防止点积结果为负值,我们需要使用max操作,而CG提供了这样的函数。本例中,使用CG的另外一个函数可以达到同样的目的,即 saturate函数。
函数:saturate(x) 参数 x:为用于操作的标量或矢量,可以是float,float2,float3等类型 描述:把x截取在[0,1]的范围内,如果x是一个矢量,那么会对它的每一个分量进行这样的操作。
在Unity中实现高光反射模型
基本光照模型中高光反射部分的计算公式: 计算高光反射需要4个参数: clight :入射光线的颜色和强度 mspecular :材质的高光反射系数
v
^
\hat{v}
v^:视角方向 r:反射方向
CG提供了计算反射方向的函数reflect 函数:reflect(i,n) 参数:i,入射方向;n,法线方向。可以是float,float2,float3等类型 描述:当给定了入射方向 i 和法线方向 n 时,reflect函数可以返回反射方向。
|