千张笔记

Email:rain_qian830@163.com
posts - 28, comments - 42, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

【原】图形流水线

Posted on 2008-10-23 22:02 千张 阅读(1399) 评论(0)  编辑 收藏 引用 所属分类: 图形学

OpenGL的管线(渲染流水线)


管线这个术语用于描述一种过程,它可能涉及两个或更多个独特的阶段或步骤。下面的图来自《OpenGL超级宝典》。


 

           
                 
当应用程序中进行OpenGL API调用时,这些命令被放置在一个命令缓冲区(OpenGL Command Buffer)里。这个命令缓冲区最终填满了命令、顶点数据、纹理数据等东西。当缓冲区被刷新时(或者由程序控制,或者由驱动程序的设计所决定),命令和数据就被传送给管线的下一个环节。

通常,顶点数据首先进行转换和光照(Transform and Lighting)。在转换阶段,描述物体几何形状的点被重新计算,以确定这个物体的位置和方向。同时所进行的光照计算将确定每个顶点应该具有的颜色亮度。

三维图形是用图元表示的,如点、线、面等,图像是用像素表示的,当计算机生成的三维图形要显示在我们所看的到的屏幕上时,必须要进行一个转换,即将图形转换成像素表示,这个过程就是光栅化(Rasterization)。

光栅化后,图像被放入帧缓冲区(Frame buffer)中。帧缓冲区就是图形显示设备的内存,这意味着这幅图像将会在屏幕上显示。

图中的箭头表示有一些命令将会跳过转换和光照阶段,例如在屏幕上显示原始图像数据(显示一副图像)。



下面我们主要看转换和光照这个环节,这个环节是一个数学计算密集型阶段,是一系列矩阵变换。下图是顶点转换管线。

                   
从原始的顶点数据通往屏幕坐标的路是相当漫长的。上图提供了这个过程的流程图,(x,y,z,w)为顶点坐标,w一般为1,(x,y,z,1)表示顶点坐标,(x,y,z,0)表示向量坐标。OpenGL中的矩阵变换都采用这种坐标表示方法,w是缩放因子,一般为1,很少需要修改。

把顶点与模型视图矩阵相乘,产生经过转换的视觉坐标。这个视觉坐标随后与投影矩阵相乘,产生裁剪坐标,这就有效地消除了可视区之外的所有数据。使用透视投影时,我们需要加入透视出发(persective division),它可以利用均匀坐标的一个属性。然后,这个裁剪坐标随后除以w坐标,产生规范化的设备坐标。最后,视口矩阵将可视区内的部分映射到一个“3D视口”上,即窗口坐标(Window coordinates),这是一个2D平面。

其中,模型视图矩阵将两个效果结合在一起:应用到对象的建模变换顺序,如平移、旋转、缩放、剪切等,以及在空间中指定照相机的方向和位置的变换。尽管模型视图矩阵是实际管道中的一个单矩阵,但也可以将它看成两个矩阵的乘积:建模矩阵M和视图矩阵V。首先应用建模矩阵,然后应用视图矩阵,所以模型视图矩阵实际上是VM的乘积。

OpenGL中的视图

下面三个函数用于设置建模变换,可修改模型视图矩阵,执行glMatrixMode(GL_MODEVIEW)之后才可使用它们:
glScaled(sx,sy,sz);
glTranslated(dx,dy,dz);
glRotated(angle,ux,uy,uz);

照相机定位和瞄准:
gluLookAt(eyex,eyey,eyez,ax,ay,az,upx,upy,upz);
这个函数的说明与前面Directx中的LookAt函数的意思一样。

投影方式设置:
glOrtho(left,right,bott,top,near,far);

glFrustum(left,right,bottom,top,near,far);
gluPerspective(fovy,aspect,near,far);

第一个用于设置平行投影,第二个和第三个用于设置透视投影。

视口变换:
glViewport(x,y,width,height)
参数X,Y指定了视图区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度。一般设置为窗口的Width和Height。



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理