美文网首页
GPU编程基础 |《GPU编程与Cg语言》读书笔记(一)

GPU编程基础 |《GPU编程与Cg语言》读书笔记(一)

作者: 温素年 | 来源:发表于2017-12-15 22:31 被阅读0次

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与CPU结构比较

第二章 GPU图形绘制管线

这一章非常非常重要,因为图形绘制管线是学习图形学的基础,只有理清楚了并且牢记于心,才能在以后的学习中有一个清晰的思路。之前学习 Unity Shader 的时候有很多地方不懂得,看了这部分就有种豁然开朗的感觉。

1. 图形绘制管线阶段

(一)应用程序阶段

    使用高级编程语言开发,主要和CPU、内存打交道。

    碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等

    得到几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件。

(二)几何阶段

    基于GPU 进行运算

    主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射

    得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标

(三)光栅阶段

    基于几何阶段的输出数据,为像素(Pixel)正确配色

    进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器( color buffer 或者 frame buffer )中。

最后,放一张GPU处理流程的图便于理解,可以对照着下面的具体说明来看。

GPU处理流程

注意:图中上面两个模块是应用程序阶段,橙色部分(顶点坐标变换部分)加上 Primitive Assembly 是几何阶段,剩下的三个模块是光栅阶段。

2. 几何阶段

主要工作是将三维顶点坐标转换为二维屏幕上的坐标。

(一)Object Space  模型空间坐标

    特点:建模时得到、与其他物体没有参照关系

    给其一个相对于坐标原点的位置,就可以转换为 world space。通常用 world matrix(顶点的转换矩阵)来表示转换关系。

* 法向量的转换矩阵是world matrix的转置的逆矩阵

(二)World Space 世界坐标

    将其转换为 eye space 需要设定一个视锥(viewing frustum),视锥以外的东西是看不到的,这个过程叫视锥裁剪(frustum culling)。如下图所示:

 

视锥 viewing frustum

* 在游戏中,我们有时候撞到物体的时候还能看到前面,是因为撞到的物体在近裁面以外,被剔除了,所以看不见了。

(三)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)?

所谓片断就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素都是经过深度比较的。


哈哈,感觉这篇博客写的好看多了!

相关文章

网友评论

      本文标题:GPU编程基础 |《GPU编程与Cg语言》读书笔记(一)

      本文链接:https://www.haomeiwen.com/subject/vumrwxtx.html