图形渲染管线

来源:互联网 发布:云计算发展史 编辑:程序博客网 时间:2024/05/21 09:12

概述

图形渲染管线(Graphics Pipeline),简单的说就是把摄像机看到的东西,绘制成一幅2D图像的过程。可以分为3个阶段:
1. 应用程序阶段
2. 几何阶段
3. 光栅化阶段

图1-1 可编程渲染管线
[图1-1 可编程渲染管线]

应用程序阶段

这个阶段是在CPU上执行的,例如batching,遮挡剔除(occlusion culling)等加速算法。因为视锥裁剪(frustum culling)是在vertex shader之后执行的,这就意味着在视锥体之外的顶点也会有顶点计算开销,所以应当尽量少的向GPU传递无用的顶点。有很多处理这个问题的加速算法,比如八叉树,还有上面提到的遮挡剔除算法。
在这个阶段的最后CPU把模型,渲染指令和贴图发送给GPU,进入几何阶段。

几何阶段

Vertex Shader

通过乘以级联的4x4变换矩阵(MATRIX_MVP)的方式,把顶点从模型空间变换到齐次裁剪空间,方便进行随后Clip/Cull/Setup操作。 以最常见的透视投影为例,在齐次裁剪空间中,把摄像机的视锥体变换成了单位立方体(x,y,z的范围都在[-1, 1]之间)。
这里写图片描述
[图1-2 视锥体变换过程]

除了对顶点的空间变换之外,还有顶点的UV,法线的变换等,最终将结果存到输出寄存器中,等待传入fragment shader中进行下一步处理。下面是它的工作流程:
这里写图片描述
[图1-3 vertex shader的工作流程]

图元装配(Primitive Assembly)

接着把顶点装配成图元,一般都是三角形。只有在单位立方体内的才会进入下一阶段,因此,完全在立方体之外的被舍弃,部分在外面的,则会保留在立方体内的部分,并且重新产生顶点装配成新的图元。然后把幸存下来的图元映射到屏幕上(x,y转化成屏幕坐标,z不变,还是[-1, 1]),进入光栅化阶段。
这里写图片描述
[图1-4 裁剪过程]

p.s. 固定渲染管线中,T&L是同时发生在几何阶段的。把顶点和光照转换到世界空间或者视点空间中,进行光照计算。然而在可编程管线中,光照可以在vertex shader中计算,也可以在光栅化之后,fragment shader中进行逐像素的计算。 因此这里并没有特别写光照部分,以免产生不必要的困惑。

光栅化阶段

光栅化

光栅化是把屏幕空间的二维坐标转化成fragment(fragment可以理解为潜在的像素,通过各种测试的fragment将会被写入后备缓存区(frame buffer),最终显示在屏幕上)。下面这张图展示了渲染管线的整个过程,可以看到,光栅化阶段把三角形转化成了所占区域的像素点,有点类似Flash中把向量图打散为像素图的过程。
这里写图片描述
[图1-5 图示化渲染管线]

Fragment Shader

光栅化后的fragment,读取vertex shader中的结果作为输入,计算这个fragment的颜色值。与vertex shader不同,fragment shader能进行贴图操作。下面是它的工作流程:
这里写图片描述
[图1-6 fragment shader的工作流程]

ROP(Raster Operations)

在将fragment写入后备缓存区之前,会进行各种测试,以判断当前fragment是要写入还是丢弃。
这里写图片描述
[图1-7 标准opengl和dx的光栅操作]

通过测试的fragment,深度和模板缓存中的值将会被更新。颜色值则会有一个blend操作,将fragment的颜色值和与颜色缓存中对应位置点的像素值做混合操作,最终写入颜色缓存中。

参考文献:
《Real Time Rendering》
《The Cg Tutorial》
http://blog.sina.com.cn/s/blog_754853c1010126u0.html
http://blog.chinaunix.net/uid-20235103-id-2680299.html

0 0
原创粉丝点击