物体在渲染后所呈现的色彩由材质决定。而前面几篇中所讲的材质的基础色彩是固定不变的,只能够通过灯光的作用产生不同的效果。然而这些效果是有限的。为了使物体所呈现的颜色更为丰富,就不仅需要设定不同位置处的反射光或透射光与入射光强弱的关系,还需具体对rgb三个通道分别进行设置。从宏观上讲,物体表面所呈现出的色彩就是多该种色彩的光能够进行反射,如果入射光中含有该色彩而反射光中不含有该色彩,那么就表明物体表面该处不能够对该种色彩进行反射。换个角度看,对三个通道光线反射的强弱可以构成RGB格式的颜色。而各处的颜色形成一个整体,就得到了纹理。对于纹理的使用,此处还没有看后续的内容,自己猜测有两种方式。第一种方式是与不包含纹理的材质的颜色进行混合。第二种方式是将纹理作为各个通道反射光线强弱的一个系数。
下面介绍纹理中的第一个基础概念:纹理坐标的生成。纹理的最基础数据是长宽均为1的一幅图像。生成的纹理坐标就是在0到1之间的二维数组。对于常规的图形引擎,仅生成这一数据即可。然而对于pbrt,由于后续一些渲染工作的需要,还需要生成与纹理坐标相关的微分几何体。对于物体或者是模型,它的每个点可能不直接存储上述形式的纹理坐标,而是根据需要按别的方式进行存储。因而就需要把别的方式存储的坐标信息转化成标准的纹理坐标形式。常见的存储方式包括4种2D形式和1种3D形式。
(1)2D(u,v)映射。这种形式下,物体表面每个点存储的(u,v)数据本身就是2维纹理坐标形式,只不过是需要考虑坐标的缩放和原点的偏移。根据缩放比例和偏移大小就很容易得到标准形式的纹理坐标。对于纹理坐标形式的微分几何体,直接考虑缩放比例就可以得到。
(2)球体映射。这种形式下,认为物体由一个纹理组成的球面做包围,物体表面某处的纹理由该点沿半径方向向球面做投影得到的纹理决定。这种情况下,不需要单独设定各点的纹理坐标。只需要先见物体表面某处的位置信息由世界坐标系变换到纹理球面的坐标系,然后分别求取变换后坐标相对于球体的纬度角和经度角,再将前者由0到pi映射为0到1,作为纹理坐标的横轴,将后者由0到2pi映射为0到1,作为纹理坐标的纵轴,从而得到标准形式的纹理坐标。对于求与纹理坐标相关的微分几何体,可以引入关于位置点的微分作为中间变量,通过求导的链式法则得到。
(3)圆柱体映射。这种形式与球体映射相类似,只不过包围物体的变成了圆柱面。需要注意一点的时,这里的圆柱面只包括侧面,不包括底面和顶面。当然这样在两个特殊位置是无法生成纹理坐标,不过一般不予考虑。当然为了便于处理,现将变换后的位置向量做了归一化处理。该向量关于圆柱一周的角度由0到2pi映射为0到1作为标准形式的纹理坐标的横轴,该向量关于圆柱的高度直接作为标准形式的纹理坐标的纵轴。它的与纹理坐标相关的微分几何体的计算与球体映射完全相同。
(4)平面映射。这种形式是将物体表面某处投影到某个平面,通过投影点在该平面的局部坐标得到标准形式的纹理坐标。关于这个平面,需要定义它在纹理坐标系中相对于原点的横纵轴偏移量,还分别需要该平面中,单位长度的分别对应纹理坐标系中的横轴和纵轴方向的向量,这两个向量可以不正交。在上述基础上既可以利用向量点积得到投影长度的方法,计算标准形式下的纹理坐标和与纹理坐标相关的微分几何体。
(5)3D映射。该种映射所使用的是三维纹理坐标。这种情况下需要做的就是将坐标点和微分几何体都通过几何变换将其由世界坐标系变换到纹理坐标系即可。