欢迎光临散文网 会员登陆 & 注册

计算机图形学基础(三):表面着色(Surface Shading)

2023-08-04 10:54 作者:宁牁兒  | 我要投稿

所有专栏系列的内容均为本人(b站id:宁牁兒)精心总结和排版,仅用于免费学习交流,任何人不得擅自用于商业活动

前面的章节已经能简单地计算观测光线和相交点了,接下来就是为该相交点着色,用于计算着色的表达式就叫做着色模型,着色模型可以完全独立于渲染系统的其它部分,接下来讨论一个最基本的着色模型,它可以用于点光源照射不透明表面。

类点光源光照(Point-like light sources)

类点光源分为两种:一,点光源,特征是足够小且距离场景比较近,可以被当做一个点来处理,它对场景中的物体有不同的照射;二,方向光源,它也可以被看做是一个点,但是它离场景比较远,所以它几乎对场景的所有物体有着相同的照射,我们不需要知道它的位置而只需要知道它的方向即可。LED灯和太阳光就是这两种光源的典型例子。

点光源光照

点光源通过它的位置(三维空间中的一点)和发光强度来描述,点光源可以在各个方向上的发光强度一样(各向同性的),也可以只在特定的方向上发光(如聚光灯)。

对于各向同性的光源,假设其辐射能量(radiant power)为1瓦特,考虑以其为中心、半径为1的球面,该光源发出的能量全部打在了这个球面上,球面面积为4%5Cpi,所以它的辐射能量密度可表示为%5Cfrac%7B1%7D%7B4%5Cpi%7D,这一密度也叫做辐射照度(irradiance)。

把这个场景推及到普遍情况,一个能量P的各向同性的点光源,打在表面半径为R的球面上,则辐射照度E为:

%5Cbegin%7Barray%7D%7Bc%7D%20E%20%3D%20%5Cfrac%7BP%7D%7B4%5Cpi%7D%5Ccdot%5Cfrac%7B1%7D%7Br%5E%7B2%7D%7D%20%3D%20I%5Ccdot%5Cfrac%7B1%7D%7Br%5E2%7D%20%5Cend%7Barray%7D

其中,I%20%3D%20%5Cfrac%7BP%7D%7B4%5Cpi%7D表示光源的光照强度,当I一定时,辐射照度与距离的平方r%5E2成反比。

图1

上面的球面是一个特殊情况,光线都是垂直地照向球面(即光线方向和表面法线同向)。大部分情况下,光线和表面法线并不同线,如果将表面转动%5Ctheta,此时的照度需要乘上因子cos%5Ctheta(兰伯特余弦定理),此时:

%5Cbegin%7Barray%7D%7Bc%7D%20E%20%3D%20I%5Ccdot%5Cfrac%7Bcos%5Ctheta%7D%7Br%5E2%7D%20%5Cend%7Barray%7D

其中%5Cfrac%7Bcos%5Ctheta%7D%7Br%5E2%7D可以叫作对点光源的几何因子,只取决于点光源和接收表面的几何位置关系,cos%5Ctheta的值可以通过指向光源的光线方向的单位向量%5Cvec%20l和表面法线方向的单位向量%5Cvec%20n点乘得到:

%5Cbegin%7Barray%7D%7Bc%7D%20cos%5Ctheta%20%26%3D%20%5Cvec%20n%5Ccdot%20%5Cvec%20l%20%5Cend%7Barray%7D

图2

方向光源光照

方向光源光照的辐射照度计算几乎和点光源一样,只是光源距离场景太远以至于%5Cfrac%7BI%7D%7Br%5E2%7D可以视为一个常量,把它叫做常量H,这个常量就是直射照度。对于方向光源光照,有:

%5Cbegin%7Barray%7D%7Bc%7D%20E%20%26%3D%20Hcos%5Ctheta%20%5Cend%7Barray%7D

反射模型

照度描述的是有多少光打在物体的表面上,而着色还要考虑到它是如何反射到观测点的。

兰伯特反射

兰伯特反射是一种理想散射,它假设光线同等地反射至所有方向,而不考虑入射光线的方向,所以此时观测点观察到的反射光L_%7Br%7D只和照度相关:

%5Cbegin%7Barray%7D%7Bc%7D%20L_%7Br%7D%20%26%3D%20kE%2C%20where%20%5Cquad%20k%20%26%3D%20%5Cfrac%7BR%7D%7B%5Cpi%7D%20%5Cend%7Barray%7D

镜面反射

很多材料都会有一些高光,比如金属、光滑的塑料、植物叶子等,当看向这些材料时,反射会随着你的观测位置变化而变化。也就是说,镜面反射依赖于观测点的位置。理想化的镜面反射的入射角和折射角相等,但实际情况是有很多物体表面并不是完全光滑的,这在图形学中被称作光泽反射

从前面我们知道光泽反射会依赖于表面法线n、光照方向l和观测向量v,一种比较简单的光泽反射模型是修正Blinn-Phong模型,这个模型的思想是:当光照方向l和观测向量v关于表面法线n对称时,会表现出最明亮的反射光,并且反射光的强度会随着观测向量v偏离对称位置而平滑下降。

图3

我们使用半程向量h来衡量观测向量v偏离对称位置的程度,半程向量指的是观测向量v和光照向量l叠加的一半。当hn方向相等时,说明观测向量v正好在对称的位置,反射光强度就越大;反之,当h越偏离n,强度就越小。可以通过计算nh的点积来衡量偏离程度,当两者重合时该点积达到最大值。修正Blinn-Phong模型还给这个值指定了一个指数p确定它下降的快慢程度:

%5Cbegin%7Barray%7D%7Bc%7D%20(n%5Ccdot%20h)%5Ep%20%5Cend%7Barray%7D

p值控制了表面反射的高亮程度,当p越大时,说明反射光强度下降的越快,也就表明了该表面的高亮程度更高。

在知道光源位置S和着色点X(即相交点)的情况下,可以计算光源至相交点的距离r和光照向量l的单位向量为%5Cvec%20l

%5Cbegin%7Barray%7D%7Bc%7D%20r%20%26%3D%20%5Cleft%20%5C%7C%20S-X%20%5Cright%20%5C%7C%2C%20%5C%5C%20%5Cvec%20l%20%26%3D%20%5Cfrac%7BS-X%7D%7Br%7D%20%3D%20%5Cfrac%7BS-X%7D%7B%5Cleft%20%5C%7C%20S-X%20%5Cright%20%5C%7C%7D%20%5Cend%7Barray%7D

半程向量的单位向量%5Cvec%20h容易得到,假设观测向量v的单位向量为%5Cvec%20v,光照向量l的单位向量为%5Cvec%20l,则有:

%5Cbegin%7Barray%7D%7Bc%7D%20%5Cvec%20h%20%26%3D%20%5Cfrac%7B%5Cvec%20l%2B%5Cvec%20v%7D%7B%5Cleft%20%5C%7C%20%7B%5Cvec%20l%2B%5Cvec%20v%7D%20%5Cright%20%5C%7C%20%7D%20%5Cend%7Barray%7D

对于兰伯特反射来说,反射光L_%7Br%7D%20%3D%20k%7BE%7D%3D%5Cfrac%7BR%7D%7B%5Cpi%7DE,即k%3D%5Cfrac%7BR%7D%7B%5Cpi%7D是一个常量,但对光泽反射来说,需要对系数k加上一个高光反射部分:

%5Cbegin%7Barray%7D%7Bc%7D%20L_%7Br%7D%20%26%3D%20(%5Cfrac%7BR%7D%7B%5Cpi%7D%20%2B%20k_%7Bs%7Dmax(0%2C%5Cvec%20n%5Ccdot%5Cvec%20h)%5Ep)E%5C%5C%20%26%3D%20(%5Cfrac%7BR%7D%7B%5Cpi%7D%20%2B%20k_%7Bs%7Dmax(0%2C%5Cvec%20n%5Ccdot%5Cfrac%7B%5Cvec%20l%2B%5Cvec%20v%7D%7B%5Cleft%20%5C%7C%20%7B%5Cvec%20l%2B%5Cvec%20v%7D%20%5Cright%20%5C%7C%7D)%5Ep)E%20%5Cend%7Barray%7D

其中系数k_%7Bs%7D叫做镜面系数(specular coefficient),控制着高光的整体明亮程度。max(0%2C%5Cvec%20n%5Ccdot%5Cvec%20h)是为了防止%5Cvec%20n%5Ccdot%5Cvec%20h出现负数的情况。此时整体的系数k%3D%5Cfrac%7BR%7D%7B%5Cpi%7D%20%2B%20k_%7Bs%7Dmax(0%2C%5Cvec%20n%5Ccdot%5Cvec%20h)%5Ep,这个表达式被叫做双向反射分布函数,它描述了反射光如何随着观测向量v和光照向量l的变化而变化。

计算机图形学基础(三):表面着色(Surface Shading)的评论 (共 条)

分享到微博请遵守国家法律