浅谈渲染流水线之GPU流水线(几何阶段)
当GPU从CPU那里得到渲染指令之后,就会进行一系列流水线操作,最终把图元渲染到屏幕上。
对于概念阶段的后两个阶段,即几何阶段和光栅化阶段,开发者无法拥有绝对的控制权,其实现的载体是GPU。GPU通过实现流水线化,大大加快了渲染速度。
虽然我们无法控制这两个阶段的实现细节,但GPU向开发者开放了很多控制权,这这一篇中我们将具体了解GPU是如何实现几何阶段的。
小贴士:为了使CPU和GPU能并行化工作,通常在CPU和GPU之间会有一个命令缓冲区,这里的命令不只有DrawCall还有改变渲染状态等。
CPU往命令缓冲区添加命令,GPU从命令缓冲区获取命令并处理,这样就会使CPU和GPU互不影响并行化工作。
几何阶段和光栅化阶段可以分为若干个更小的阶段,每个阶段GPU提供了不同的可配置性或可编程性。
从图中可以看出,GPU流水线接收顶点数据作为输入,这些顶点数据是由应用阶段加载到显存中,再由DrawCall指定的。
A)应用阶段:
B)几何阶段主要分为以下几个阶段:
1.顶点着色器
顶点着色器是完全可编程的,它通常用于实现顶点的空间变换、顶点着色等功能。它的输入来自CPU,顶点着色器的处理单位是顶点,也就是说输入进来的每个顶点都会调用一次顶点着色器。
顶点着色器不可以创建或销毁任何顶点,而且无法得到顶点之间的关系。正是因为这种相互独立性,GPU可以利用本身的特性并行化处理每一个顶点,这意味着这一阶段的处理速度会非常快。
顶点着色器主要工作有:
a)坐标转换:
顾名思义,就是对顶点的位置进行某种变换(模拟水面、布料等)。一个最基本的顶点着色器必须完成的工作是:把顶点坐标从模型空间转换到齐次剪裁空间。
然后再由硬件做透视除法(屏幕映射阶段)后,最终得到归一化的设备坐标。具体数学上的实现细节将在后面的篇幅进行说明。
b)逐顶点光照:
计算和输出顶点的颜色。
2.曲面细分着色器
曲面细分着色器是一个可选着色器,它用于细分图元。
3.几何着色器
同样的它也是一个可选着色器,它可以被用于执行逐图元的着色操作,或者被用于产生更多的图元。
4.裁剪
由于我们的场景可能会很大,而摄像机的视野范围很有可能不会覆盖所有的场景物体,一个很自然的想法就是把那些不在摄像机视野范围內的物体裁剪掉不进行处理。
一个图元和摄像机视野的关系有3种:完全在视野内、部分在视野内、不在视野内。完全在视野内的图元将会被传递到下一个阶段,完全在视野外的图元则被舍弃不会再处理。
而那些部分在视野內部分在视野外的图元则需要一个处理就是裁剪。例如一条线段第一个顶点在视野內第二个顶点在视野外这时候需要用一个新的顶点来替换第二个顶点。而这个新的顶点则是这条线段和摄像机视野相交的点。
5.屏幕映射
这一阶段输入的坐标仍然是三维坐标系下的坐标,即范围在单位立方体內。
屏幕映射的任务是把每个图元的x,y坐标转换到屏幕坐标系。屏幕坐标系是一个二维坐标系。此时你可能会问z值去哪里了?屏幕映射不会对z值做任何处理。而转换后的屏幕坐标和z值又构成了一个坐标系—窗口坐标系。这些值会一起传递到光栅化阶段。
以上数据继续向流水线的后面传递,经过一系列计算、各种测试最终会成为屏幕上美丽的图像。而这个过程也是后续篇幅我要说的光栅化阶段的工作。
更多内容请关注我的公众号-----程序员速查手册