渲染管线学习

描述几何学上的3D场景和设置了虚拟照相机,把这个场景转换为2D图像显示在显示器上,这一系列的操作叫做渲染管线

一,灵活顶点格式(Flexible Vertex Format,FVF):

描述在顶点缓冲区的顶点存储格式中包含哪些属性,使应用程序只使用它需要的顶点数据,排除那些它不需要的组成成分。

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)//位置属性,漫反射属性

顶点结构为 D3DFVF_XYZ 时,执行视图,投影,世界等变换以及光线计算。

                   D3DFVF_XYZRHW 时,表示顶点已经经过了处理,直接将顶点进行光栅操作

宏定义中指定的顺序必须要与顶点结构体中顶点数据定义的顺序保持一致。

二,三角形单元

 所有物体均可以由三角形逼近拟合来构成

三角形顶点的指定顺序称为绕序,顺时针朝正面,逆时针朝负面

为了解决点的重复利用问题,引入索引的概念。

Vertex vertexList[4] = {v0, v1, v2, v3};

WORD indexList[6] = {0, 1, 2, //三角形0

0, 2, 3}; //三角形1

三,绘制流水线

变换和照明(T&L阶段):

每个对象的顶点从局部坐标系变换到基于像素的屏幕坐标系,考虑虚拟摄像机的属性,对顶点应用照明,裁剪,窗口缩放等效果

T&L顶点--世界变换--取景变换--消隐--光照处理--裁剪--投影变换--T&L顶点

光栅化处理:

将经过转化并添加了照明效果的顶点组织为点,线和三角形。将绘制结果显示在屏幕上,同时

应用纹理映射并添加多种属性。决定深度缓冲的结果,判断哪些像素是用户可见的。

局部坐标系:

描述了物体的方向及构成物体的元素相对于物体中心的位置

世界坐标系:

整个场景的坐标系,所有物体都必须从自己的局部坐标系变换到世界坐标系中(称为世界变换的运算),如果在场景中是运动的则必须为该物体

定义一个随时间变化的序列

场景中的光源也在世界坐标系中定义

世界变换:SetTransform():第一个State,参数指定了变换的类型

将一个物体的中心设置在世界坐标系的(10,0,0)上

D3DMATRIXA16 matWorld;

D3DMatrixTranslaton(&matWorld,10.0f,0.0f,0.0f);//矩阵赋值

g_pd3dDevice->SetTransform(D3DTS_WORLD,&worldMatrix);//世界坐标系变换

视图(观察)坐标系:

也是相对于世界坐标系定义的

世界坐标系中的所有的物体都将随着照相机的变换而做相同的变换,这个变换叫视图坐标系变换

D3DXMATRIX *D3DXMatrixLookAtLH(

D3DXMATRIX* pOut, // 指向返回的视图矩阵

CONST D3DXVECTOR3* pEye, // 照相机在世界坐标系的位置

CONST D3DXVECTOR3* pAt, // 照相机在世界坐标系的观察目标点

CONST D3DXVECTOR3* pUp // 世界坐标系的上方向(0, 1, 0)

);

 

D3DXVECTOR3 position(5.0f, 3.0f, –10.0f);

D3DXVECTOR3 targetPoint(0.0f, 0.0f, 0.0f);

D3DXVECTOR3 worldUp(0.0f, 1.0f, 0.0f);

 

D3DXMATRIX V;

D3DXMatrixLookAtLH(&V, &position, &targetPoint, &worldUp);

 

Device->SetTransform(D3DTS_VIEW, &V);


消隐:

剔除处于屏幕背面或者物体内部的面。

早期采用深度排序法:先把屏幕置成背景色,再把物体各个面按其离视点的远近进行排序,按照由远及近绘制各面

现在最常用的是Z-缓冲算法:一个更新缓冲区存储各点的像素值,一个Z-缓冲存储器储存相应的Z值。

通过计算新像素到摄像机的距离,把它们和已经存储在z-缓冲存储器中的z值进行比较,如果新的像素离摄像机更近,则用新的替换旧的。

消隐可以通过修改绘制状态函数(SetRanderState)的参数来实现

裁剪:

拣选那些超出了可视体范围的几何图形的过程叫做裁剪

投影:

将3d场景转化为2d图像表示,将n维空间的点投射到小于n维的空间中的变换过程称为投影

实质就是定义可视体,并将可视体内的几何图形投影到窗口上去

投影变换分为正交投影和透视投影

透视投影的特点:三维物体在二维空间中近大远小,使得生成的图像具有纵深感(真实感),符合人眼的投影规律

D3DXMATRIX *D3DXMatrixPerspectiveFovLH(

D3DXMATRIX* pOut, // 返回的投影矩阵

FLOAT fovY, // 用弧度表示的视野角度(垂直区域)

FLOAT Aspect, // 宽高比(纵横比)避免窗口在拉伸时出现物体的畸变

FLOAT zn, // 近裁剪面到坐标原点的距离

FLOAT zf // 远裁剪面到坐标原点的距离

);

 

90度视角、前裁剪面距离为1、后裁剪面距离为1000的平截头体创建投影矩阵:

 

D3DXMATRIX proj;

D3DXMatrixPerspectiveFovLH(

&proj, PI * 0.5f, (float)width / (float)height, 1.0, 1000.0f);

Device->SetTransform(D3DTS_PROJECTION, &proj);

视口变换:

空间变换的最后一步就是通过定义屏幕显示区域的实际宽高等参数,将顶点从投影坐标转换为最终显示的以像素为单位的屏幕坐标

视口变换将顶点坐标从投影窗口转换到屏幕的一个区域,该区域称为视口

typedef struct _D3DVIEWPORT9 {

DWORD X;

DWORD Y;//相对于屏幕的位置

DWORD Width;

DWORD Height;//视口区域的大小

DWORD MinZ;

DWORD MaxZ;//深度缓存中的最小深度值和最大深度值

} D3DVIEWPORT9;

渲染(光栅化):

任务是绘制地三角形图元,计算每个三角形的颜色值,处理结果是在屏幕上显示一副2d图像。

实际上就是将矢量图像素化的过程,将连续的图像用像素点阵来表示并且显示在电子屏幕上的过程。

发布了107 篇原创文章 · 获赞 31 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/101547406