一 目前最新的可编程图形硬件已经具备了如下功能:
1 支持vertex programmability 和fragment programmability
2 支持IEEE32 位浮点运算
3 支持4 元向量,4 阶矩阵计算
4 提供分支指令,支持循环控制语句
5 具有高带宽的内存传输能力(>27.1GB/s)
6 支持1D、2D、3D 纹理像素查询和使用,且速度极快
7 支持绘制到纹理功能(Render to Texture,RTT)
二、GPU和CPU
nGPU 具有高并行结构(highly parallel structure),所以GPU 在处理图形数据和复杂算法方面拥有比CPU 更高的效率
gPU 采用流式并行计算模式,可对每个数据进行独立的并行计算(流内任意元素的计算不依赖于其它同类型数据)
CPU 和GPU 上的代码比较:提取2D 图像上每个像素点的颜色值
三、GPU 图形绘制管线图形绘制管线可分为三个主要阶段
–应用程序阶段,使用高级编程语言(C、C++、JAVA 等)进行开发,主要和CPU、内存打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等经典算法都在此阶段执行
–几何阶段,主要负责顶点坐标变换、光照、裁剪、投影以及屏幕映射,该阶段基于GPU 进行运算,在该阶段的末端得到了经过变换和投影之后的顶点坐标、颜色、以及纹理坐标
–光栅阶段,基于几何阶段的输出数据,为像素(Pixel)正确配色,以便绘制完整图像,,每个像素的信息存储在颜色缓冲器(color buffer 或者frame buffer)中
四、Shade Language(着色语言)
shader language 被定位为高级语言,如,GLSL 的全称是“High Level ShadingLanguage”,Cg 语言的全称为“C for Graphic”,并且这两种shader language 的语法设计非常类似于C 语言。
高级语言的一个重要特性是“独立于硬件”,但是目前shader language 完全依赖于GPU 构架,
任意一种shader language 都必须基于图形硬件,所以GPU 编程技术的发展本质上还是图形硬件的发展。在shader language存在之前,展示基于图形硬件的编程能力只能靠低级的汇编语言。
使用shader language 编写的程序称之为shader program(着色程序)。着色程序分为两类:
–vertex shader program(顶点着色程序,运行在顶点处理器上)
–fragment shader program(片断着色程序,运行在片段处理器上)
Vertex Shader Program
顶点着色程序从GPU 前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;
然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。
Fragment Shader Program
片断就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值比较
片断着色程序对每个片断进行独立的颜色计算,最后输出颜色值的就是该片段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。
Shader language 目前有3 种主流语言:
–基于OpenGL 的GLSL(OpenGLShading Language,也称为GLslang)
–基于Direct3D 的HLSL(High Level ShadingLanguage)语言,
–NVIDIA 公司的Cg (C for Graphic)语言。