Alice:请问你能告诉我该走哪条路吗?
猫:这取决于你想去哪儿。
Alice:我不怎么介意到哪儿去。
猫:那你走哪条路都可以。
Alice:只要我能到某个地方。
猫:只要你走的足够远,你肯定能到某个地方。
最近读完了《GPU编程与Cg语言之阳春白雪下里巴人》的前三章,这本书开头引用了《爱丽丝梦游仙境》的一段话,我非常喜欢。所以,这里也借这段话开头了。
第一章 绪论
这一章讲了GPU的历史什么的,了解一下就可以了,让我有所感悟的只有以下两点:
1. GPU是干什么的?
目前最新的GPU已经具备了如下功能:
(1) 支持 vertex programmability 和fragment programmability;
(2)支持 IEEE32 位浮点运算;
(3)支持 4 元向量,4 阶矩阵计算;
(4)提供分支指令,支持循环控制语句;
(5)具有高带宽的内存传输能力(>27.1GB/s);
(6)支持 1D、2D、3D 纹理像素查询和使用,且速度极快;
(7)支持绘制到纹理功能(Render to Texture,RTT)。
2. 为什么要有GPU?( GPU 与 CPU 比较 )
CPU:大部分面积为控制器和寄存器,数据高速缓存和流控制。一个时刻只处理一个数据,不存在真正意义上的并行。
GPU:拥有更多的ALU用于数据处理,适合对密集型数据进行并行处理。具有多个处理器核,在一个时刻可以并行处理多个数据。

第二章 GPU图形绘制管线
这一章非常非常重要,因为图形绘制管线是学习图形学的基础,只有理清楚了并且牢记于心,才能在以后的学习中有一个清晰的思路。之前学习 Unity Shader 的时候有很多地方不懂得,看了这部分就有种豁然开朗的感觉。
1. 图形绘制管线阶段
(一)应用程序阶段
使用高级编程语言开发,主要和CPU、内存打交道。
碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等
得到几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件。
(二)几何阶段
基于GPU 进行运算
主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射
得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标
(三)光栅阶段
基于几何阶段的输出数据,为像素(Pixel)正确配色
进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器( color buffer 或者 frame buffer )中。
最后,放一张GPU处理流程的图便于理解,可以对照着下面的具体说明来看。

注意:图中上面两个模块是应用程序阶段,橙色部分(顶点坐标变换部分)加上 Primitive Assembly 是几何阶段,剩下的三个模块是光栅阶段。
2. 几何阶段
主要工作是将三维顶点坐标转换为二维屏幕上的坐标。
(一)Object Space 模型空间坐标
特点:建模时得到、与其他物体没有参照关系
给其一个相对于坐标原点的位置,就可以转换为 world space。通常用 world matrix(顶点的转换矩阵)来表示转换关系。
* 法向量的转换矩阵是world matrix的转置的逆矩阵
(二)World Space 世界坐标
将其转换为 eye space 需要设定一个视锥(viewing frustum),视锥以外的东西是看不到的,这个过程叫视锥裁剪(frustum culling)。如下图所示:

* 在游戏中,我们有时候撞到物体的时候还能看到前面,是因为撞到的物体在近裁面以外,被剔除了,所以看不见了。
(三)Eye Space 观察坐标(视点坐标)
从视点坐标空间到屏幕坐标空间步骤:
(1)用透视变换矩阵把顶点从视锥体中变换到裁剪空间的 CVV 中;
(2)在 CVV 进行图元裁剪;
(3)屏幕映射:将经过前述过程得到的坐标映射到屏幕坐标系上。
(四)Project and Clip Space 屏幕坐标
(五)Primitive Assembly 图元装配
在之前的流水线中是对顶点的处理,这个阶段是根据索引将顶点链接在一起,得到我们需要绘制的图元(点、线、面)。
* 裁减算法主要包括:视域剔除(View Frustum Culling)、背面剔除(Back-Face Culling)、遮挡剔除(Occlusing Culling)和视口裁减等。
3. 光栅阶段
(一)光栅化 Rasterization
决定哪些像素被集合图元覆盖的过程。
(二)Pixel Operation
计算出每个像素的颜色值,步骤如下:
(1)消除遮挡面
(2)纹理操作 Texture Operation
(3)混色 Blending
(4)Filtering
4. GPU 中的 buffer 类型
(一)Z Buffer
z 值计算公式 z_value = f·(z - n)/(f - n)
其中f 表示视点到远裁减面的空间距离, n 表示视点到近裁减面的空间距离。z值决定了物体之间的遮挡关系,在透视投影中z值是非线性变化的。
(二)Stencil Buffer 模板缓冲器
通常附加到 z buffer 中,这是一个用来“做记号”的 buffer。
(三)Frame Buffer 帧缓冲区
用于存放显示输出的数据,一般是像素颜色值。有时也被认为是 color buffer(颜色缓冲器)和 z buffer 的组合。
第三章 Shader Language
这一章的内容也比较少,只是简单介绍了一下 Shader Language。需要了解的几点:
1. 主流的 Shader Language
(1)基于OpenGL的GLSL
(2)基于Direct3D的HLSL
(3)NVIDIA公司的Cg语言(C for Graghic)
2. Shader Program 分类
(1)vertex shader program 顶点着色程序:在顶点处理器上运行,负责顶点坐标变换
(2)fragment shader program 片段着色程序:在片段处理器上运行,负责像素颜色计算
* 要注意纹理坐标在 vertex program 中处理,而纹理信息在 fragment program 中处理。
3. 什么是片段(Fragment)?
所谓片断就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素都是经过深度比较的。
哈哈,感觉这篇博客写的好看多了!

网友评论