1.问题
如上图所示,前面的内容已经知道怎么对物体进行着色,在球和地板上出现了不同的颜色,也就是定义了不同的kd颜色系数,那么如何在物体不同位置定义不同属性呢?
2.纹理映射
2.1什么是纹理映射
如上图球的表面贴上一张绘制了地图的二维图片,就变成了地球仪,这张二维的图片就是纹理(Texture),把这个图贴到球表面伴随着这纹理的放大缩小以及将纹理中的某个点和球上的某个点对应起来,这个过程就是纹理映射(Texture Mapping)。
2.2UV坐标
那么怎么将纹理贴到物体表面呢?我们知道在三维空间中,最基本的是三角形,那么物体上的三角形怎么映射到纹理上,也就是说在纹理空间上在哪。
在图形学中,每一个三角形都会分配一个坐标(u,v),叫做纹理坐标(UV坐标),这样就能知道三物体三角形如何映射到纹理上。不论贴图是正方向还是长方形,u和v的取值范围都是[0,1]。如下图所示。
这样就知道了三角形每个顶点都对应一个UV坐标。那么就可以将纹理的颜色对应到物体上,如下图所示。
2.3纹理平铺
纹理可以应用到各种各样的物体表面,而且纹理映射不止使用一次。举个例子,如下图所示。
将上图任何一点的纹理坐标显示出来,如下图所示,可以看到一块纹理在物体上重复使用,像贴瓷砖一样铺满了整个物体。也就是说不同模型位置可以映射到相同纹理。
我们发现上图中重复纹理坐标中间有明显的缝,但是在场景中是正常的。这说明纹理本身设计边缘可无缝连接,这种方式叫做平铺(tiled)。如下图所示。
2.4如何读取纹理
上述中提到着色时,可以获取到每一个顶点对应的纹理坐标,然后从纹理中取色。这样只是为了说明使用纹理的过程,例如处理一个三角形的纹理映射时,只知道三个顶点对应纹理坐标,那如何知道三角形内部任意一点对应的纹理坐标呢,答案是做插值,做插值时需要用到重心坐标。
3.重心坐标
3.1为什么使用重心坐标
使用重心坐标(Barycentric Coordinates)为了做三角形内的插值。三角形内部做插值是因为很多操作是在三角形顶点上完成和计算的,并且希望在三角形内部有一个平滑的过渡。在三角形顶点上可以定义各种属性,比如纹理坐标、颜色、法线向量等,所以这些属性也可以进行插值计算,也就是说可以对三角形任何属性进行插值。
3.2重心坐标的概念
重心坐标是定义在一个三角形上的。如上图所示,三角形ABC,该三角形所在平面内任意一点(x,y)可以表示该三角形三个顶点坐标的线性组合,此时(α,β,γ)所表示的点就是该点(x,y)的重心坐标。A、B、C都是指坐标,如(xA,yA)、(xB,yB)。也就是说只要给定任意三个点,只要有一个点在三个点所在的平面上,都可以通过α+β+γ = 1。
注意:
1.α+β+γ = 1 是将所求的点限定在三角形所在的平面内。
2. α、β、γ 的取值必须都大于0,满足都大于0可以将所求的点限定在三角形内。
求A、B、C的重心坐标
既然在三角形平面任意一点都可以用线性组合表示,那么A点重心坐标是什么呢。
如上图所示,当(α,β,γ)=(1,0,0)时,满足线性组合表示A点。所以A点重心坐标是(1,0,0)。同理可知B,C的重心坐标,B:(0,1,0)、C:(0,0,1)。分别求出了A、B、C的重心坐标,那么怎么求三角形上任意一点的重心坐标呢?
3.3计算重心坐标
3.3.1如何求重心坐标
三角形上任意一点的重心坐标可通过面积比计算。如下图所示,A点对面的三角形AA,B点对面的三角形AB,C点对面的三角形AC。α、β、γ的值可以满足下图右侧公式,如α的值等于AA三角的面积除以三个三角形面积之和。β、γ的值同理。
3.3.2三角形重心的重心坐标
由于三角形重心和三角形3个顶点组成的3个三角形面积相等,通过上述公式很容易得出,如下图所示。
3.3.3求三角形内任意一点的重心坐标
我们知道两个向量叉乘的模等于两个向量围成的平行四边形面积,而三角形面积是平行四边形面积除以2,所以三角形的面积可以用叉乘求得,即可求出重心坐标。还有另外一种方法,下面给出一个已经推导的公式,可直接通过该公式来计算重心坐标,如下图所示。
3.4重心坐标做插值运算
有了重心坐标后,就可以直接在三角形内部任何一点属性做插值。那么怎么做呢?
重心坐标来做插值,那么做插值的属性同样也可以用重心坐标去线性的组合出来。假设三角形中V点的重心坐标为(α,β,γ),Va,Vb,Vc为三角形的三个顶点的坐标,就是三个属性,这时可以通公式V=αA + βB + γ*C来得到V点的坐标,也就是属性。这个属性可以是任何属性,比如颜色、法线、纹理坐标、深度值等等。
注意:
投影变换前利用重心坐标插值和投影变换后插值结果是不一样的(重心坐标会变),插值运算是在三维空间中进行的,已经投影到屏幕上的坐标如何变回去?答案是利用投影矩阵的逆矩阵进行逆变换。
建议:
三维空间的属性需在三维空间中完成插值,然后在映射到二维中去。
4.总结
通过将三角形上对应纹理坐标,将纹理的颜色一一对应到三角形顶点上,然后通过插值计算出任何位置的颜色,再着色过程中将颜色作为着色模型的系数,这样就能完整的渲染出图像了。
后续的章节,将会介绍纹理的应用以及遇到的问题。