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