GPU 图形绘制管线

参考自 《GPU 编程与CG 语言之阳春白雪下里巴人》


图形绘制管线描述 GPU 渲染流程,即”给定视点、三维物体、光源、照明模式和纹理等元素,如何绘制一幅二维图像”。

在《实时计算机图形学》一书中,将图形绘制管线分为三个主要阶段:应用 程序阶段、几何阶段、光栅阶段。

应用程序阶段,使用高级编程语言(C、C++、JAVA 等)进行开发,主要和 CPU、内存打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等 经典算法都在此阶段执行。在该阶段的末端,几何体数据(顶点坐标。法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件(时间瓶颈);数据总线是一个可以共享的通道,用于在多个设备之间传送数据;端口在两个设备之间传送数据的通道;带宽用来描述端口或者总线上的吞吐量,可以用每秒字节(b/s) 来度量,数据总线和端口(如加速图形端口,Accelerated Graphic Port,AGP)将 不同的功能模块“粘接”在一起。由于端口和数据总线均具有数据传输能力,因此 通常也将端口认为是数据总线。

几何阶段,主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU进行运算,在该阶段的末端得到了经过 变换和投影之后的顶点坐标、颜色、以及纹理坐标。

光栅阶段,基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制 完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲 器( color buffer 或者 frame buffer )中。

1.几何阶段

几何阶段的主要工作是”是变换三维顶点坐标”和”光照计算”。

输入到计算机中的是一系列三维坐标点,但是我们最终需要看到的是,从视点出发观察到特定点(可以理解为,三维坐标点,要使之显示在二维的屏幕上)。一般情况下, CPU 帮我们自动完成了这个转换。基于 GPU 的顶点程序为开发人员提供了控制顶点坐标空间转换的方法。

根据顶点坐标转换的先后顺序,主要有如下几个坐标空间,或者说坐标类型: Object space,模型坐标空间; World space,世界坐标系空间;Eye space,观察坐标空间;Clip and Project space,屏幕坐标空间。

无论在现实世界,还是在计算机的虚拟空间中,物体都必须和一个 固定的坐标原点进行参照才能确定自己所在的位置。

每个人都是从各自的视点出发观察这个世界,无论是主观世界还是客观世 界。在计算机中每次只能从唯一的视角出发渲染物体。在游戏中,都会提供漫游的功能,屏幕显示的内容随着视点的变化而变化。这是因为 GPU 将物体顶点坐标从 world space 转换到了 eye space。

所谓 eye space ,即以 camera (视点或相机)为原点,由视线方向。视角和远近平面,共同组成一个梯形的三维空间,称之为 viewing frustum (视锥),如下图,

Paste_Image.png

一旦顶点坐标转换到 eye space 中,就需要判断哪些点是视点可见的。位于 viewing frustum (视锥)梯形体以内的顶点,被认定为可见,而超出这个梯形体之外的的场景数据,会被视点去除(Frustum Culling,也称之为视锥裁剪)。这一步通常称之为『 Clip(裁剪) 』,识别指定区域内或区域外的图形部分的过程称之为裁剪算法。

很多人在理解该步骤时存在一个混乱,即“不清楚裁减与投影的关系和两者 发生的先后顺序”,不少人觉得是“先裁减再投影”,不过事实并非如此。因为在不规则的体中进行裁剪并非易事,所以经过图形学前辈们的 精心分析,裁剪被安排到一个单位立方体中进行,该立方体的对角顶点分别是 (-1,-1,-1)和(1,1,1),通常称这个单位立方体为规范立方体(Canonical view volume, CVV)。

从视点坐标空间到屏幕坐标空间 (screen coordinate space)事实上是由三步组成:

1).用透视变换矩阵把顶点从视锥体中变换到裁剪空间的 CVV 中;

2).在 CVV 进行图元裁剪;

3).屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上。

确定只有当图元完全或部分的存在于视锥内部时,才需要将其光栅化。当一个图元完全位于视体(此时视体以及变换 为 CVV )内部时,它可以直接进入下一个阶段;完全在视体外部的图元,将被剔除;对于部分位于视体内的图元进行图元进行裁剪处理。

裁减算法主要包括:视域剔除( View Frustum Culling )、背面剔除 ( Back-Face Culling )、遮挡剔除( Occlusing Culling )和视口裁减等。

2.光栅化阶段

光栅化:决定哪些像素被集合图元覆盖的过程( Rasterization is the process of determining the set of pixels covered by a geometric primitive )。

经过坐标转化之后,可以得到每个点的屏幕坐标值,但是存在两个问题:

问题一:点的屏幕坐标值是浮点数,但像素都是由整数点来表示的,如果确定屏幕坐标值做对应的像素?

问题二:在屏幕上需要绘制的有点、线、面,如何根据两个已经确定位置的 2 个像素点绘制一条线段,如果根据已经确定了位置的 3 个像素点绘制一个三角面片?

Pixel operation 又称为 Raster Operation ,是在更新帧缓存之前,执行最后一系列针对每个片段的操作,其目的是:计算出每个像素的颜色值。 Pixel operation 包含如下四个方面:

1). 消除遮挡面

2). Texture operation,纹理操作,也就是根据像素的纹理坐标,查询对应的纹理值;

3). Blending,混色,根据目前已经画好的颜色,与正在计算的颜色的透明度(Alpha),混合为两种颜色,作为新的颜色输出。

4). Filtering,将正在算的颜色经过某种 Filtering (滤波或者滤镜)后输出。 可以理解为:经过一种数学运算后变成新的颜色值。

GPU 内存架构

寄存器和内存的区别:

从物理结构而言,寄存器是 CPU 或 GPU 内部的存储单元,即寄存器是嵌在 CPU 或者 GPU 中的,而内存则可以独立存在;从功能上而言,寄存器是有限存储容量的高速存储部件,用来暂存指令、数据和地址。Shader 编程是基于计算机图形硬件的,这其中就包括 GPU 上的寄存器类型, glsl 和 hlsl 的着色器虚拟机版本就是基于 GPU 的寄存器和指令集而区分的。

Paste_Image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值