DirectX3D渲染图形的过程可分为两步:第一步为T&L过程;第二步为光栅化。光栅化,大家应该都知道,就是按照图形顶点信息设置对应像素的颜色,然后呈现在屏幕上的过程。而T&L,可能有些朋友不太了解,这一章,我们就来对T&L进行一下学习。
首先,要知道什么是T&L,T&L就是Transforming and Lighting,即顶点的坐标变换和光照过程。通常被称为顶点变换流水线。
DirectX3D中图形的顶点的坐标系三维坐标系,而电脑屏幕是一个二维的平面,我们要将三维坐标系中的顶点渲染到二维的电脑屏幕上,就需要对顶点进行处理,使其投射到二维坐标系中,这个过程就是顶点的坐标变换。
T&L的完整过程分为以下五步:
1、世界变换
物体在三维空间中的运动以及形变的过程叫做世界变换。其中物体所在的三维空间为世界空间,物体的坐标系为世界坐标系。世界变换主要包括移动、旋转、缩放等。
2、观察变换
物体由世界坐标系转换到观察坐标系的过程叫做观察变换。这其实就像用摄像机摄影一样,摄影机所在位置就是观察点,摄像机的朝向就是观察方向。以观察点为坐标原点,以观察方向为坐标轴的坐标系就是观察坐标系。
3、光照
光照,就是光源对顶点颜色的影响过程。
4、投影变换
将三维空间中的顶点投影到二维平面的过程叫做投影变换。这个过程可以看做,顶点经过观察变换后,将三维坐标投影到摄像机的胶片上,以胶片的中心为坐标原点的坐标系为投影坐标系。
5、视区变换
将浮点坐标转换为像素坐标的过程叫做视区变换。最终的坐标与定义的视区的长宽比例以及长宽大小有关。
不过DirectX3D的图形渲染也没有必要必须需要经过T&L处理,像在之前的章节中,我们绘制的图形使用的顶点,在定义时被定义为经过变换的顶点,即直接将顶点的坐标作为屏幕坐标绘制出来,并没有进行T&L处理,但如果想得到绚丽的效果,T&L处理还是必须的。
这一章,先不讲解光照,光照方面的东西比较多,将会在以后章节中讲解。下面主要来讲解一下顶点坐标变换的相关内容。
谈到顶点坐标变换,就不得不说一下在DirectX3D中顶点变换的原理。
在DirectX3D中,一切的变换都离不开矩阵。在讲解三维坐标变换前,先来看一下二维坐标的变换,这有助于大家对矩阵操作的理解。
矩阵对图形的操作主要是移动、旋转和缩放。
T为单位矩阵,即定义二维空间中的直角坐标系。从功能上划分,可以将T划分为4个子矩阵:
主要对图形进行旋转、缩放、对切、错切等变换;
用于对图形作投影变换;
[a31 , a32]
用于对图形进行移动操作;
[a33]
用于对整个图形进行缩放操作。
二维图形变换示例:
1、图形移动
已知变换矩阵M=,则有
[x1,y1,1]=[x,y,1]M=[x + Mx , y + My , 1]
其中矩阵M中Mx、My分别表示在x轴、y轴上的变化量,矩阵[x1,y1,1]是矩阵[x,y,1]经过变换的矩阵。
2、图形旋转
已知变换矩阵M=,则有
[x1,y1]=[x,y]M=[x*cosθ-y*sinθ,x*sinθ+y*cosθ]
其中θ为旋转角度,通常情况以逆时针方向为正方向。
3、图形缩放
已知变换矩阵M=,则有
[x1,y1,1]=[x,y,1]M=[Sx*x ,Sy*y, 1]
其中Sx、Sy为图形在x、y方向上的缩放系数。
三维图形的变换与二维矩阵变换稍有不同,它是基于4*4矩阵的。
三维图形变换示例:
1、图形移动
已知变换矩阵M=,则有
[x1,y1,z1,1]=[x,y,z,1]M=[x+Px,y+Py,z+Pz,1]
其中Px、Py,Pz分别为x、y、z方向上的变化量。
2、图形旋转
三维图形的旋转与二位图形旋转有所区别,包括绕x、y、z轴旋转3种情况。
绕x轴旋转:
已知变换矩阵M=,则有
[x1,y1,z1,1]=[x,y,z,1]M=[x,y*cosθ-z*sinθ,y*sinθ+z*cosθ,1]
其中θ为绕x轴旋转角度。
绕y轴旋转:
已知变换矩阵M=,则有
[x1,y1,z1,1]=[x,y,z,1]M=[x*cosθ+z*sinθ,y,-x*sinθ+z*cosθ,1]
其中θ为绕y轴旋转角度。
绕z轴旋转:
已知变换矩阵M=,则有
[x1,y1,z1,1]=[x,y,z,1]M=[x*cosθ-y*sinθ,x*sinθ+y*cosθ,z,1]
其中θ为绕z轴旋转角度。
3、图形缩放
已知变换矩阵M=,则有
[x1,y1,z1,1]=[x,y,z,1]M=[x*qx,y*qy,z*qz,1]
其中qx、qy、qz分别为图形在x、y、z方向上的缩放系数。
现在大家对图形中顶点坐标的变换原理应该有了一个大概的认识了。下面回到DirectX中。
在DirectX3D中提供了D3DMATRIX矩阵类型,以及其他扩展的矩阵类型。得到对应变换矩阵后,可以通过函数SetTransform进行设置。函数原型如下:
C#
1 | HRESULT SetTransform(D3DTRANSFORMSTATETYPE state, CONST D3DMATRIX *pMatrix); |
其中state的取值可以为D3DTS_WORLD、D3DTS_VIEW和D3DTS_PROJECTION,分别表示世界变换、观察变换和投影变换。pMatrix为指向变换矩阵的指针。
通过调用此方法,我们就实现了对应的变换。
好,今天就说到这里吧,在下一章中,我将用一个“太阳、地球、月球”系统来演示各种顶点坐标变换的实际做法。
此文仅供参考,如有不足,请不吝赐教,大家一起学习进步。