3D图形芯片的算法原理分析
消除、明暗处理。光栅化、隐藏面消除、明暗处理是整个3D图形生成过程中最内层的处理。他们是三个二维插值过程。光栅化是用屏幕空间三角形的顶点坐标插值,以求得三角形的边所截取的三角形内扫描线段的端点坐标,并进而求得所截扫描线段上的象素坐标。隐藏面消除则是通过对屏幕空间三角形顶点的深度值(Z坐标)进行插值,从而获得三角形内扫描线段上每个象素的深度值。明暗处理是用同样的方法由顶点光强求得三角形内扫描段上每个象素的光强。这三种处理的算法具有相同的数学表示形式,只需将坐标、深度或光强代入该方程就可以得到相应的结果。总之,场景的绘制过程可概括为:
对场景中的每个物体的每个多边形做几何变换将其变换到屏幕空间;
对多边形内的每一个扫描段求出其端点及其上每个象素的坐标;
对扫描段上的每个象素做隐藏面消除处理及明暗处理。
1.光栅化
光栅化处理通过插值求得三角形内扫描段的x坐标的起点和终点。问题是何处是终点和起点?当使用实数坐标时在象素之内的何处进行采样,屏幕坐标是取整数还是保留小数精度?这些问题如果处理得不好,就会在多边形之间产生孔洞,产生重叠的多边形,这会在透明效果处理时产生严重问题。如果反走样处理不精确,则会在带有纹理的表面上产生纹理不连续现象。例如,如果对屏幕坐标取整,则屏幕多边形的顶点将延伸或缩回到离它最近的象素,这样多边形的大小将发生微小的变化,而且不能用密集采样进行反走样处理,动画中的"颤抖"现象便是由此而引起的。在象素内何处采样并不重要,重要的是对象素采样的处理必须一致。
2.隐藏面消除
全屏幕Z-Buffer(深度缓存器)算法已成为图形学事实上的标准隐藏面消除算法,他虽然简单但存储要求很高。Z-Buffer算法可看作是工作在三维屏幕空间。每一个象素有一个二维屏幕空间坐标( xs , ys )和由眼睛空间顶点的深度值插值而得到的z深度值。深度缓存器开始时被初始化为远处裁剪平面的深度,对每一个象素比较其插值得到的深度值与已存储在深度缓存中( xs , ys )处的值,如果该值小于存储值,则新计算的象素更靠近观察者。这时新计算的象素的明暗处理值将覆盖帧缓存中的旧值,深度存储器中的值也换成新计算的值。深度缓存器算法对场景数据库组织及场景复杂性没有限制。在处理复杂场景或物体时,应保证足够的深度精度。
3.明暗处理
首先计算多边形顶点的明暗参数,然后在多边形平面上进行插值。这样绘制出的物体不但具有很强的三维立体感,而且消除了用于近似曲面的多边形之间的公用边所形成的不连续特征。实现这一处理方式的算法有两种,一种称作Gouraud明暗处理,一种称作Phong明暗处理(均以发明者的名字命名)。这也是基于多边形的绘制日益受欢迎的一个重要原因。Gouraud明暗处理的速度快,但不能产生精确的高光效果,通常用在对速度要求高的场合,如飞行模拟、交互式CAD应用等。Phong明暗处理可以生成高质量的图像,但将耗费庞大的硬件资源。Gouraud明暗处理仅在多边形的顶点使用局部反射光照模型计算光强,然后使用顶点处的光强通过插值求出多边形内各象素的光强值。而Phong明暗处理则对顶点的法向量进行插值,并对多边形内的每一个象素用局部反射光照模型计算其光强。一般说来,多边形顶点的光强是顶点的法向量相对于光源和视点的方向的函数,这就是所谓的局部反射光照模型。顶点的法向量用来近似原物体表面在该点处的法向量,通过平均公用该顶点的所有多边形的法向量求得。
Gouraud明暗处理仅与局部光照模型中的漫反射分量一起使用,这是因为当高光点完全落在多边形之内时,其对多边形顶点处没有任何影响。该方法是目前3D图形硬件都支持的唯一的明暗处理方法。
4.特殊效果
纹理映射、透明以及雾化(大气效应)等真实感效果都是在象素处理阶段实现的。物体表面纹理的定义是在世界坐标系中进行的,通过预处理,每个带有纹理的多边形在其顶点数据中建立了与相应纹理图的映射关系。在绘制带有纹理的多边形时,其相应的纹理图也同时被加载到纹理存储器中,在求出物体上象素坐标的同时其相应的纹理坐标也被计算出来。用该纹理坐标从纹理存储器中读出相应纹理象素的值,将其与明暗处理的结果进行混合就得到要显示的象素值。雾化(大气效应)则是在计算出的象素值上乘上一个与深度有关的衰减因子。对落在同一屏幕位置的象素点的象素值按其所属物体的透明系数进行加权融合就可以产生透明效果。
五、结束语
3D图形应用对计算和存储资源的巨大需求以及3D图形生成算法与传统计算机体系结构的不相适应产生了3D
- 3D图形芯片的算法原理分析(07-16)
- DSP程序的加密保护体制设计 (11-10)
- 基于WinPhone 7的体感健身系统的设计与实现(07-30)
- 3D NAND这么火,比2D NAND到底优秀在哪?(01-08)
- 基于FPGA的3D图像处理器IP核的实现(06-04)
- 轻松实现3D图形处理的设计技巧(06-04)