7

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

 3 years ago
source link: https://www.xuanyusong.com/archives/1001
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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=Direct3D研究院之T&L流水线(五) - 雨松MOMO程序研究院 - 5,则有

[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进行设置。函数原型如下:

HRESULT SetTransform(D3DTRANSFORMSTATETYPE state, CONST D3DMATRIX *pMatrix);

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

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

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

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

ZXGoto祝大家编程愉快。

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK