在光照这部分里我讲了怎么实现物体的明暗关系,但物体还是纯色。在实际的3D建模过程中,3D物体一般都需要手绘贴图,本次讲一讲渲染引擎是怎么实现贴图的。
贴图,即使用一张2D图片,来规定3D模型上一部分或者全部的点的每一个的颜色。
(一般是用来设置每个点的颜色,但也可以设置法线等其他属性,比如法线贴图)
关于如何将3维的点一一映射到2D图片上,是Maya,3DMAX等建模软件的工作,想了解的可以搜索“UV展开”,本文主要讲引擎获得了模型和贴图后,怎么将每个点的颜色从贴图中获取。
贴图是2D的,我们称x轴为u,y轴为v,也就是uv,范围为[0, 1]。
在光栅化过程中,每一个三角形有3个顶点,这3个顶点的uv数据建模软件已经存进去了,我们直接读取出来,根据其uv值取出图像上对应坐标的颜色即可。
注意:
- 贴图的分辨率要重映射到0~1,比如一张1028×720的图片,u要乘上1027,v要乘上719来变换为图片坐标。
- 如果u是0.123456789,乘上1027之后还是个小数怎么办?因为图片像素点都是整数,所以我们要把这个小数坐标的颜色进行插值。插值方法为双线性插值(bilinear interpolation)。
即该点的颜色为其4个相邻整数点颜色的加权平均,当s=0,t=0时,p在A点,所以B,C,D的系数都是0,A的系数为1,根据这个特征来确定4个系数,这就是这4个系数长这样的原因。
到目前为止,我们可以拿到物体上某个点的贴图颜色了,那么融合光照之后公式又是什么样呢?
在Phong里面,把Ka和Kd替换为贴图颜色。Ks不换,因为一般都是白色。
在Gouraud里面,全部换成贴图颜色。
在三角形内部的点,贴图uv是多少?
答:插值,和光照里面插值方法一样,平面方程插值。
目前为止,计算出来的贴图应该是下图中间这样的
我们看到有明显的不对的地方,这是因为我们插值的uv计算是在仿射空间计算的,而从image到perspective的过程中,图形会扭曲,所以插值的uv也会扭曲。
解决方法:透视修正
将uv转换到perspective或者screen space进行uv插值,将插出来的uv值再变回仿射空间获取像素颜色。