首页 > 【Direct3D研究院之PC网游开发】 > Direct3D研究院之T&L流水线(五)
2012
05-25

Direct3D研究院之T&L流水线(五)

DirectX3D渲染图形的过程可分为两步:第一步为T&L过程;第二步为光栅化。光栅化,大家应该都知道,就是按照图形顶点信息设置对应像素的颜色,然后呈现在屏幕上的过程。而T&L,可能有些朋友不太了解,这一章,我们就来对T&L进行一下学习。

首先,要知道什么是T&LT&L就是Transforming and Lighting,即顶点的坐标变换和光照过程。通常被称为顶点变换流水线。

DirectX3D中图形的顶点的坐标系三维坐标系,而电脑屏幕是一个二维的平面,我们要将三维坐标系中的顶点渲染到二维的电脑屏幕上,就需要对顶点进行处理,使其投射到二维坐标系中,这个过程就是顶点的坐标变换。

T&L的完整过程分为以下五步:

1、世界变换

物体在三维空间中的运动以及形变的过程叫做世界变换。其中物体所在的三维空间为世界空间,物体的坐标系为世界坐标系。世界变换主要包括移动、旋转、缩放等。

2、观察变换

物体由世界坐标系转换到观察坐标系的过程叫做观察变换。这其实就像用摄像机摄影一样,摄影机所在位置就是观察点,摄像机的朝向就是观察方向。以观察点为坐标原点,以观察方向为坐标轴的坐标系就是观察坐标系。

3、光照

光照,就是光源对顶点颜色的影响过程。

4、投影变换

将三维空间中的顶点投影到二维平面的过程叫做投影变换。这个过程可以看做,顶点经过观察变换后,将三维坐标投影到摄像机的胶片上,以胶片的中心为坐标原点的坐标系为投影坐标系。

5、视区变换

将浮点坐标转换为像素坐标的过程叫做视区变换。最终的坐标与定义的视区的长宽比例以及长宽大小有关。

不过DirectX3D的图形渲染也没有必要必须需要经过T&L处理,像在之前的章节中,我们绘制的图形使用的顶点,在定义时被定义为经过变换的顶点,即直接将顶点的坐标作为屏幕坐标绘制出来,并没有进行T&L处理,但如果想得到绚丽的效果,T&L处理还是必须的。

这一章,先不讲解光照,光照方面的东西比较多,将会在以后章节中讲解。下面主要来讲解一下顶点坐标变换的相关内容。

谈到顶点坐标变换,就不得不说一下在DirectX3D中顶点变换的原理。

DirectX3D中,一切的变换都离不开矩阵。在讲解三维坐标变换前,先来看一下二维坐标的变换,这有助于大家对矩阵操作的理解。

矩阵对图形的操作主要是移动、旋转和缩放。

Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 1

T为单位矩阵,即定义二维空间中的直角坐标系。从功能上划分,可以将T划分为4个子矩阵:

Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 2

主要对图形进行旋转、缩放、对切、错切等变换;

Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 3

用于对图形作投影变换;

[a31 , a32]

用于对图形进行移动操作;

[a33]

用于对整个图形进行缩放操作。

二维图形变换示例:

1、图形移动

已知变换矩阵M=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 4,则有

[x1,y1,1]=[x,y,1]M=[x + Mx , y + My , 1]

其中矩阵MMxMy分别表示在x轴、y轴上的变化量,矩阵[x1,y1,1]是矩阵[x,y,1]经过变换的矩阵。

2、图形旋转

已知变换矩阵M=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 5,则有

[x1,y1]=[x,y]M=[x*cosθ-y*sinθ,x*sinθ+y*cosθ]

其中θ为旋转角度,通常情况以逆时针方向为正方向。

3、图形缩放

已知变换矩阵M=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 6,则有

[x1,y1,1]=[x,y,1]M=[Sx*x Sy*y, 1]

其中SxSy为图形在xy方向上的缩放系数。

三维图形的变换与二维矩阵变换稍有不同,它是基于4*4矩阵的。

三维图形变换示例:

1、图形移动

已知变换矩阵M=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 7,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x+Px,y+Py,z+Pz,1]

其中PxPyPz分别为xyz方向上的变化量。

2、图形旋转

三维图形的旋转与二位图形旋转有所区别,包括绕xyz轴旋转3种情况。

x轴旋转:

已知变换矩阵M=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 8,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x,y*cosθ-z*sinθ,y*sinθ+z*cosθ,1]

其中θ为绕x轴旋转角度。

y轴旋转:

已知变换矩阵M=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 9,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x*cosθ+z*sinθ,y,-x*sinθ+z*cosθ,1]

其中θ为绕y轴旋转角度。

z轴旋转:

已知变换矩阵M=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 10,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x*cosθ-y*sinθ,x*sinθ+y*cosθ,z,1]

其中θ为绕z轴旋转角度。

3、图形缩放

已知变换矩阵M=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 11,则有

[x1,y1,z1,1]=[x,y,z,1]M=[x*qx,y*qy,z*qz,1]

其中qxqyqz分别为图形在xyz方向上的缩放系数。

现在大家对图形中顶点坐标的变换原理应该有了一个大概的认识了。下面回到DirectX中。

DirectX3D中提供了D3DMATRIX矩阵类型,以及其他扩展的矩阵类型。得到对应变换矩阵后,可以通过函数SetTransform进行设置。函数原型如下:

其中state的取值可以为D3DTS_WORLDD3DTS_VIEWD3DTS_PROJECTION,分别表示世界变换、观察变换和投影变换。pMatrix为指向变换矩阵的指针。

通过调用此方法,我们就实现了对应的变换。

好,今天就说到这里吧,在下一章中,我将用一个“太阳、地球、月球”系统来演示各种顶点坐标变换的实际做法。

此文仅供参考,如有不足,请不吝赐教,大家一起学习进步。

ZXGoto祝大家编程愉快。

最后编辑:
作者:ZXGoto
这个作者貌似有点懒,什么都没有留下。
捐 赠如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

Direct3D研究院之T&L流水线(五)》有 9 条评论

  1. kuku小夭 说:

    OpenGL的流水线和DirectX3D的流水线一样的吗?

  2. 小李 说:

    文章不错

  3. Crazy.Dz 说:

    写的很详细,开始学习。。。

留下一个回复

你的email不会被公开。