X
日期:2016-06-12 23:55:47作者:cho来源:爱活网

移动图形芯片的故事(上)GPU是什么鬼?

光栅处理阶段要干些什么呢?

在获得了经过变换和投影处理的顶点及其相关联的着色信息后,光栅化处理阶段的目的就是计算并设置好被对象覆盖区域的像素颜色。这个处理被称作光栅化或者扫描转换,也就是把二维坐标上包含深度(Z 轴)信息和各种相关着色信息的顶点到屏幕上像素的转换。

移动图形芯片的故事(上)GPU是什么鬼?

这个处理阶段一般可以拆分为 4 个工位:

1、三角形设定

2、三角形遍历

3、像素着色

4、输出合并

三角形设定

这一步会进行三角形表面的微分以及其他关于三角形表面数据的计算,计算出来的数据会被用于扫描转换以及几何阶段所产生的各种着色数据的插值处理。在GPU上这一步会采用固定硬件功能单元来实现。

三角形遍历

这一步用作确定像素的中心是否被三角形覆盖 ,如果该像素被三角形覆盖的话,就会生成对应的片元(fragment)。

查找哪些样本或者像素是否位于三角形内通常被称作三角形遍历或者扫描转换。

每个三角形对应片元的属性都是由该三角形的三个顶点数据插值而成,例如片元的深度值以及来自几何阶段的着色数据。

像素着色

所有的逐像素(per-pixel)着色计算都在这一步执行,使用的输入数据是之前插值的着色数据。像素着色发送到下一个工位的计算的结果可能是一个色彩值也可能是多个色彩值。

和三角形设定以及三角形遍历不同采用固定硬件功能单元不同的是,现在的像素着色都是由可编程的GPU内核执行。

在像素着色所依赖的众多技术中最为重要的就是贴图(texturing),所谓贴图就是把一张或者多张图片“贴”到对象上。

输出合并

在这一步执行的操作主要是将之前步骤生成的色彩信息进行合并形成最终输出的像素色彩。

用于存放像素色彩信息的缓存被称作色彩缓存,一般情况下是以红、绿、蓝三个色元的方式存放,此外还有一个用于存放像素对应深度信息值的深度缓存(一般采用 Z-Buffer)。

移动图形芯片的故事(上)GPU是什么鬼?

在GPU中实现这一步的功能单元有几种叫法,例如 ROP、Output Merger 或者 Back-End。

在这个阶段,Output Merger 会根据深度缓存(depth buffer 或者 Z-buffer)存放的深度信息判断是否更新色彩缓存中的色彩值。

例如当前像素计算出来的深度值(例如是 0.1)比深度缓存中对应像素的值小(例如是 0.2),则表示当前像素的三角形比色彩缓存存放的像素所对应的三角形更靠近“摄像头”,于是GPU会对该图元的色彩进行计算并把新计算出来的色彩值和深度值更新到色彩缓存和深度缓存中,否则的话就不会更新当前像素的缓存。

在整个场景完成渲染后,色彩缓存中存放的都是从摄像机视角位置看到的可视图元色彩值。

这样处理的好处是三角形可以使用任意次序来渲染,但是如果图元或者说三角形是部分透明的话,则必须依照从远到近的三角形层次进行渲染。这是 Z-Buffer 的主要缺点之一。

像素除了色彩缓存和深度缓存外,还有其他利用通道或者缓存的技术来用于过滤和捕捉片元(fragmet)信息。

通常和色彩一起存放于色彩缓存的阿尔法通道(Alpha Channel)包含了每个像素的相对不透明值,开发人员可以在进行深度测试之前对到来的片元先执行名为阿尔法测试(Alpha Test)的操作。如果片元的 alpha 值测试(一般是等于、大于等简单的操作)为“假”,那么这个像素的后续处理操作就会被省略掉。这个操作通常用于确保完全透明的片元不会对 Z-buffer 构成影响。

此外,还可能会涉及到名为蜡板缓存(Stencil Buffer)的技术。Stencil Buffer 作为一个离屏缓存一般用于存放已渲染图元的位置,它通常用于进行一些特殊效果的处理,例如将一个“实心”圆存放到蜡板缓存中,之后配合其他操作,就可以将被覆盖图元的色彩值控制为只有在位于这个实心圆中的时候才被呈现,相当于一个遮罩的作用。

移动图形芯片的故事(上)GPU是什么鬼?

以上这些缓存都被统称为帧缓存,但是在一般情况下,帧缓存特指色彩缓存和深度缓存。由于画面渲染是需要时间的,为了保证出到显示器或者显示屏的时候图元都是已经完成渲染的,人们引入了双缓存技术,渲染中的被称为后台缓存(back buffer),完成渲染的称作前台缓存(front buffer),在后台缓存完成渲染后,马上变成前台缓存,而前台缓存就切换为后台缓存,以此类推。

正在加载评论...