本篇介绍
本篇介绍下着色,包括漫反射,冯模型,艺术着色。
漫反射
有一些物体看起来比较粗糙,比如纸,石头等,如果我们盯着该类物体的一个地方看,同时也做各种旋转,会发现没什么变化,也就是不会出现高光,这类物体就叫 Lambertian objects.接下来就介绍如何给这类物体着色,这些操作是在世界坐标系中完成的。 Lambertian objects模型是说物体表面的颜色是与法线和光源方向的余弦是成正比的:
image.png
image.png
再将该公式详细一些,就是表面颜色还和物体漫反射的颜色,光强有关系,这样公式可以详细写成如下:
image.png
Cr是漫反射颜色,Cl是光强。
这时候对于光源背面的物体,计算出来的颜色就会是黑色的,实际上,我们看到很多物体背着光,可是也并不是黑色的,这是因为有环境光的存在,环境光就是由于很多物体不仅会接收光,同时也会向周围反射光,这样即使不被光源直接照到,也会被反射的光简洁照亮。也就是可以看成是空气中漂浮着很多比较昏暗的光源。这时候的表面着色公式如下:
image.png
Ca就是环境光部分,可以简单看成一个常量。
在给物体着色的时候,如果直接使用上面介绍到的着色公式,会发现表面看起来是多面的,针对这个问题可以用三角形来近似每个表面,然后计算三角形每个顶点处的法线,针对法线计算顶点处的颜色,然后再利用三角形重心坐标公式即可插值出三角形内部各个点的颜色。如下图所示:
image.png
冯模型
一些物体的表面看起来会有高光,比如抛光的瓷地板,光泽颜料,白板等,高光的颜色也和表面的颜色没什么关联,只是单纯的反射光颜色。如下所示:
image.png
从上图可以看出,高光是在观察角和入射光的反射方向接近情况下出现的,那么就可以用下面公式来表示:
image.png
这儿的参数p是为了增大衰减的速度,可以看到下图:
image.png
也有一种方法是比较法线和入射方向与观察方向的中线之间的余弦:
image.png
image.png
image.png
这时候的表面着色公式如下:
image.png
这儿的参数Cp是用来控制高光的强度。
如果在直接光栅化的时候,可以利用冯法线插值来对法线进行插值:
image.png
这样只要只要各个顶点处的法线,就可以计算出三角形内部某个像素处的法线。
艺术着色
前面介绍的Lambertian和Phong着色模型是基于了模拟真实表面的启发式设计,现在再介绍一种是模拟人工绘画的着色,有时候也叫非真实感渲染。 在画线的时候,人工绘画与真实世界的一个区别是前者会绘制轮廓。绘制轮廓的条件如下:
image.png
n是两个相邻三角形的法线,e是从公共变到观察点的向量。 如果三角形面是用隐形公式表示的,那么也可以写成如下公式:
image.png
如果表面有拐角,这时候也需要绘制对应的折痕:
image.png
还有一个是冷暖着色,一个方向用冷色着色,比如蓝色,另外一个方向用暖色着色,比如橘色。可以通过设置一个暖光源l来实现:
image.png
最终的颜色就是暖色和冷色的混合:
image.png
一般最常用的Cw和Cc如下:
image.png
再比较下不同着色的效果:
image.png
左边的是Phong着色,中间的是冷暖着色,右边的是冷暖着色,并且添加轮廓的,看起来有动漫的风格了。