找回密码
 立即注册
查看: 198|回复: 0

GPU 图形绘制管线简介

[复制链接]
发表于 2023-1-15 16:13 | 显示全部楼层 |阅读模式
来源《GPU 编程与CG 语言》
一、概述

      图形绘制管线描述GPU 渲染流程,即“给定视点、三维物体、光源、照明模式,和纹理等元素,如何绘制一幅二维图像”。图形绘制管线分为三个主要阶段:应用程序阶段、几何阶段、光栅阶段。
      应用程序阶段,使用高级编程语言(C、C++、JAVA 等)进行开发,主要和CPU、内存打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等经典算法都在此阶段执行。在该阶段的末端,几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件(时间瓶颈)。
      几何阶段,主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU 进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标。
      光栅阶段基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器(color buffer 或者frame buffer)中。
值得注意的是:光照计算属于几何阶段,因为光照计算涉及视点、光源和物体的世界坐标,所以通常放在世界坐标系中进行计算;而雾化以及涉及物体透明度的计算属于光栅化阶段,因为上述两种计算都需要深度值信息(Z 值),而深度值是在几何阶段中计算,并传递到光栅阶段的。
二、几何阶段

      应用程序阶段输入到计算机中的是一系列三维坐标点,一般情况下,几何阶段GPU自动将三维坐标经过顶点坐标变换转换到二维屏幕上。这些顶点坐标变换,可以由开发人员进行控制。
      根据顶点坐标变换的先后顺序,主要有如下几个坐标空间,或者说坐标类型:Object space,模型坐标空间;World space,世界坐标系空间;Eye space,观察坐标空间;Clip and Project space,屏幕坐标空间。下图表述了GPU 的整个处理流程,其中茶色区域所展示的就是顶点坐标空间的变换流程。


注:   1 模型空间坐标与其他物体没有任何参照关系,它是将object space coordinate 和world space coordinate 区分开来的关键。无论在现实世界,还是在计算机的虚拟空间中,物体都必须和一个固定的坐标原点进行参照才能确定自己所在的位置,这是world space coordinate的实际意义所在。我们将一个模型导入计算机后,就应该给它一个相对于坐标原点的位置,那么这个位置就是world space coordinate,从object space coordinate 到world space coordinate 的变换过程由一个四阶矩阵控制,通常称之为worldmatrix。   
2 顶点法向量在模型文件中属于object space,在GPU 的顶点程序中必须将法向量转换到world space 中才能使用,如同必须将顶点坐标从object space 转换到world space 中一样,但两者的转换矩阵是不同的,准确的说,法向量从object space 到world space 的转换矩阵是world matrix 的转置矩阵的逆矩阵。
3 eye space,即以camera(视点或相机)为原点,由视线方向、视角和远近平面,共同组成一个梯形体的三维空间,称之为viewing frustum(视锥)。近平面,是梯形体较小的矩形面,作为投影平面,远平面是梯形体较大的矩形,在这个梯形体中的所有顶点数据是可见的,而超出这个梯形体之外的场景数据,会被视点去除(Frustum Culling,也称之为视锥裁剪)。
4 视点坐标空间到屏幕坐标空间screen coordinate space)事实上是由三步组成:用透视变换矩阵把顶点从视锥体中变换到裁剪空间的 CVV(用于裁剪的规范立方体) 中,即把顶点从viewing frustum 变换到CVV 中,这个过程才是我们常说或者听说的“投影”;再在 CVV 进行图元裁剪;最后进行屏幕映射,就是将经过前述过程得到的坐标映射到屏幕坐标系上。其中确定只有当图元完全或部分的存在于视锥内部时,才需要将其光栅化。当一个图元完全位于视体(此时视体以及变换为CVV)内部时,它可以直接进入下一个阶段;完全在视体外部的图元,将被剔除;对于部分位于视体内的图元进行裁减处理。
三、光栅化阶段(Rasterization)

      经过一系列顶点坐标变换后,现在我们得到了每个点的屏幕坐标值(Screen coordinate),也知道我们需要绘制的图元(点、线、面)。顶点(vertex)  以及绘制图元(线、面)经过特定算法对应到像素。
      接下来就是在更新帧缓存之前给像素赋予颜色,这个过程为Pixel operation。流程如下图:



OpenGL和Direct3D中的Raster Operations

它包含 1 消除遮挡面  2 Texture operation,纹理操作,根据像素的纹理坐标查询对应的纹理值 3 Blending,透明度混合  4 Filtering滤镜

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 12:38 , Processed in 0.091879 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表