A chain is no stronger than its weakest link.
实力决定于短板

模型的位置和形状决定于他们的几何形体以及相机位置
显示效果决定于他们的材质属性,光源以及材质贴图以及着色器

显示范围是一个截头椎体(frustum/frusta(复数))

构架

每个阶段都是并行的, 一个分为n个步骤的非管线系统如果使用了管线,将会有n倍的增长. 但是管线的速度由最慢的决定.
图形学中粗略分为四个阶段:
application, geometry processing, raterization, pixel proceessing

每个阶段都可能有数个子管线.
渲染速率可能用FPS或者ms毫秒来衡量,Hz一般用来衡量硬件

应用程序阶段主要靠通用CPU,一般都是多核心的,可以多线程执行.
比如碰撞检测, 全局加速算法, 动画, 物理模拟等.

几何阶段处理变换,投射.决定哪些需要画,哪些不需要,以及画在什么位置.几何阶段通常在GPU上,有可编程核心和硬件固定操作.

栅格化阶段通常以三个点为输入形成一个三角形,然后找到所有三角形中的像素,接着进入下一阶段.

像素处理阶段决定具体颜色和深度测试,也有可能会有像素级操作比如混合.栅格化和像素处理完全是基于GPU的.

应用程序阶段 Application Stage

应用程序阶段可以被开发者完全控制,可以通过减少推送的面数来提高渲染效率
把GPU看做是高度并行化的通用处理器也可以加快进度
这一阶段的重点是推送几何体(点线三角面)
这一阶段完全基于软件实现,因此没有固定的子进程,18.5节有许多超标量多进程的实现方式.
这一阶段经常会实现的是碰撞检测.还有键鼠,VR等的输入.通常会用到加速算法例如剔除.

几何阶段 Geometry Stage

几何阶段通常是每个三角面和每个点的操作,通常有四个流程:

点着色, 投射, 剔除, 屏幕显示

点着色

点着色阶段主要负责读取跟每一个点有关的信息, 例如顶点色, 传统做法会把顶点色获取后根据每个三角形进行插值. 现在顶点色还可以用来做动画, 4.4节4.5节有讲到.
首先要描述顶点的位置, 一般模型需要经过多次变换才能最终输出结果,因为他们通常有自己的模型空间, 需要经过model transform(变换)才能变为场景空间. 模型可以创建实例而不需复制.
模型坐标和世界坐标以及相机坐标(空间)
视口空间通常是相机朝着z轴负方向
顶点着色主要在第三章和第五章
顶点着色阶段还要做的是为投射和裁剪做准备
无论是希望得到轴测图还是透视图, 它都会把可视空间变为一个标准化可视空间(canonical view volume)(1,1,1)(-1,-1,-1)为顶点.
变换之后的坐标被称为(clip corrdinates)这些坐标被称为齐次点,第四章会讲到,最终会除以w这些都是为了下面的Clipping环节能够正常进行.
尽管这些矩阵变换是在体积上的, 他们还是被称作是投射, 因为在变幻之后, 三维转换为了二维,z轴的坐标也不再被保存,而是被保存为一张Z轴的深度图(Z buffer).

点着色可选项

每一个管线都会有顶点处理的阶段,还有其他可选,例如体素化,模型着色,流输出. 他们的使用与能力和硬件有关,而且通常不一定用.第三章会讲到.

体素 Tessellation

第一个可选管线是体素化.其中还有Hull Shader, tessellator以及域着色器(可以把一系列的点集转换为更多的点集用于生成三角面) 距离相机的远近可以用来决定数量

模型着色器 Geometry Shader

下一个可选的阶段是模型着色器,这个着色器更早出现,也更常用.最常用于生成粒子.例如为了做烟花它可以把一个点转换为朝着摄像机的面.

流输出 Stream Output

最后一个可选阶段是流输出.这个阶段使得我们可以不仅仅传递一组的信息,还可以传递多组信息,例如刚提到的烟花.
顺序是 体素化 模型着色 流输出, 每一个都是可选的.

裁剪

只有部分或全部在可视范围之内的元素才会进入栅格化管线以及后面的像素处理阶段.
由于需要裁切,使用投射矩阵就意味着模型是被单位立方体所裁切,这使得裁切过程具有一致性.
裁切过程2.6章会详细介绍.除了单位立方裁切以外,用户还可以指定裁切平面.19.1章818页展示了这样的可视化,称作sectioning, 截面图.
使用齐次点是为了正确对透视场景进行插值.最后进行透视除法(perspective division)可以把三角面全部归一到单位立方中.最后一步geometry步骤就是把这个转换为屏幕坐标(window coordinates)

屏幕映射



d 是离散的像素指数, c是连续的浮点值
pixel的坐标都是从左到右的,但是OpenGL和DX不一样, OpenGL使用笛卡尔坐标系,使用屏幕左下角为坐标原点,DX使用左上角.

栅格化

pixel(picture element) rasterization scan conversion
triangle setup (primitive assembly) triangle traversal

如何判断模型单元和像素重叠,是需要根据GPU设置来的
比如说可以通过多重采样,或者保守栅格化(conservative rasterization)23.1.2章会提到, 这种方法以像素和模型相交为判断标准.

三角准备(triangle setup)

固定管线, 在这一阶段 differentials, edge equation还有其他三角信息会被计算, 并用于三角遍历, 还有各种模型阶段产生的渲染信息.

三角遍历(triangle triversal)

这里会找到像素在哪个三角形中,遍历三角形.每一个三角片元的属性和由点产生的各类信息都会生成,包括片元的深度还有着色信息.这里为保证透视正确的插值会执行.所有的像素和采样会被推送到下一个阶段, 像素处理.

像素处理阶段(Pixel Processing)

这一阶段,所有的像素都是由各个序列的合集所产生.这一阶段被分为像素着色和混合两个阶段.

像素着色(pixel shading)

这一阶段不同于三角遍历, 是由可编程核心执行的,你可以提供任意想要的计算.大量的技巧可以使用, 包括最为常见的贴图.可以使用1,2,3维的图片信息.这一阶段的结果是像素.

合成(merging)

像素颜色存在缓存颜色缓冲区(color buffer)中, 就是一个RGB颜色矩阵, 合成阶段的目的就是去合成各个片元的颜色, 这个阶段也被称为ROP,(raster operation/ render output unit). 虽然不是完全可编程的, 但是高度可定制.
这一阶段也负责可见性的解析, Z缓冲区的算法很简单,O(n)(n是元素的个数)的收敛度. 但这个方法不能解决半透明的问题, 会讲解. 半透明需要等不透明的物体完全渲染好了之后由后往前的顺序渲染,或者使用一个独立的算法(5.5章).
颜色缓冲也可以通过alpha通道来丢掉像素(discard operation), 而且支持各种触发, 不需要影响到z buffer
模板缓冲(stencil buffer)可以影响到color buffer 或z-buffer.所有这些功能被称为raster operation,栅格操作,可以影响到透明度以及颜色混合, 混合是可控制不能完全编程, 但是有一些API可以支持栅格顺序编程.
framebuffer帧缓冲是由所有缓冲共同组成的.
当一个元素到达了栅格化阶段.为了避免看到合成过程和栅格化过程, 有双重缓冲(double buffering), 意味着场景渲染前一帧之后,后一帧(back frame)就在替换了.替换是在vertical retrace(垂直回扫)之间进行的.更多关于缓冲区和方法的请见5.4.2 23.6 23.7

完整的管线

文档更新时间: 2018-08-07 21:36   作者:刘电