3D渲染流水线

来源:互联网 发布:淘宝运行模式 编辑:程序博客网 时间:2024/04/29 21:26

下面开始详解3D渲染流水线:

1、首先要设置好各种转换矩阵(相机矩阵、投影矩阵、模型矩阵,D3D要分别设置这三个,Opengl则把相机矩阵和模型矩阵相乘作为一个结果来设置)。然后准备好顶点以及把顶点组成图元的索引数据。

2、把顶点和索引(图元信息数据)交给显卡。显卡的顶点处理单元开始工作了,显卡内部依次对每个顶点处理,这里有两种模式,固定管线和Shader模式。

3、顶点处理器,每个顶点处理的过程是通过世界矩阵和相机矩阵把顶点位置转换到相机空间中,然后再通过投影矩阵转换到裁剪坐标系中,这样以后就可以在裁剪坐标系进行裁剪了。这个顶点处理过程也包括光照和贴图的处理,以分配给每个顶点颜色信息.(注意,光照和贴图是这个步骤开始处理的)。这个阶段可以由用户写的VertexShader代替。

4、图元装配和裁剪阶段,这个阶段把上面转换好的顶点根据定点索引和图元类型组装,组装结果是一个图元数组(底层统一转为三角形处理)。然后把组装的结果根据相机的可视区域(相机可视区域在透视投影下是一个四棱锥)进行裁剪。视域体之外的图元被抛弃,横跨视域体边缘以及视域体内部的图元保留。

5、光栅化。对于上一步中剩下的每一个三角形,把它三个顶点从透视空间映射到屏幕空间。然后转换后的顶点在屏幕上依然是一个三角形(有可能退化为一个点或线,但这不影响算法),对于映射到屏幕上的三角形内的每一个像素,根据它在三角形中的位置,通过三角形原来的三个顶点进行插值。插值得到的结果包括纹理坐标、顶点法线等,这些信息会被传入下一个阶段。

6、片元处理器(OPENGL中的称呼)或称为像素处理器(D3D中的称呼)阶段。这个阶段可以由用户写的PixelShader代替。这个阶段可输入顶点处理器插值后传过来的纹理坐标或像素点法线或者用户自定义输出变量。这个阶段主要输出一个颜色值,包括alpha。也可以输出一个Z值,好像不常用。所以应该知道,在这里像素处理器是可以改变像素深度的。

7、对上一个阶段输出的片元信息进行各种测试,先进行alpha test, 没通过测试的像素不会进入下一步测试。然后进行stencil test(根据stencil buffer上的值)和z-test(根据这个像素的Z值和z-buffer上的值进行比较),根据测试结果会对stencil buffer进行一些修改。

8、对上一个阶段的剩下的传过来的像素,更新它在Z-Buffer中的Z值,然后开始与帧缓冲区中已存在的该位置的像素根据混合方式进行混合(Alpha Blend)。混合以后的像素就被"画"到屏幕上了。


流程大体这样。有表达错误的请帮忙指正。

其中有一些要注意的,stencil test 和 alpha test 什么区别呢?alpha test的测试数值来源是对象纹理所生成的alpha值,大多是直接从贴图中获得。stencil测试熟知的来源是画面上所存储的stencil值。stencil test 一般配合 alpha test使用。给alpha设置一个参考值,来更新画面,将通过alpha测试的像素的stencil值设置为某个值。下面的步骤中再使用这个stencil值。

注意光照和贴图使用的时机。其实光照和贴图第一次实在顶点处理器中使用的,但后面图元中的插值出来的像素依然是需要插值出来的贴图坐标的(光照不一定,固定管道光照根据光照模型来设置图元中其他像素的光照颜色),在像素中计算光照属于per-pixel-lighting。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhouyl010/archive/2010/12/07/6061040.aspx

原创粉丝点击