渲染流水线过程 rendering pipeline
渲染流水线是以摄像机为观察视角而生成2D图像的一系列完整步骤。
输入装配器 -> 顶点着色器 -> 外壳着色器 -> 曲面细分阶段 -> 域着色阶段 -> 几何着色器阶段 -> 流输出阶段 -> 光栅化阶段 -> 像素着色器阶段 -> 输出合并阶段
输入装配器:
Direct处理顶点数据的过程,各种类型的数据,比如顶点,三角形带,索引等等。
顶点着色器:
利用顶点着色器来实现许多特效,例如变换,光照和位移贴图顶点。
(1)局部坐标->世界坐标
(2)世界坐标 -> 摄像机坐标
这个变换被称为取景变换(view transform)。利用求世界坐标到观察空间的逆变换。
W=RT -> V=W^-1=(RT)^-1=T^-1*R^-1=T^-1*R^T
投影和齐次剪裁空间:令观察空间的坐标到投影平面。被称为透视投影变换(perspective projection transformation).
PS:
我们在图形学中,一般会有五个坐标系,分别是:
物体坐标系(本地坐标系)Local Space 或 Model Space
世界坐标系 World Space
观察者坐标系(摄像机坐标系) View Space
裁剪空间 Clipping Space
屏幕空间 Screen Space
其中前四个矩阵之间,主要通过model, view, projection矩阵进行相关的变换, 裁剪空间到屏幕空间通过视口变换进行;前三个是三维空间,后面两个是二维空间。
其转换过程如图1.1所示:
所有的变换都发生在顶点着色器,经过顶点着色器,所有的顶点都变成了屏幕上的二维坐标,下一步是进行图元装配之后进入几何着色器。
(可选)曲面细分阶段:
是利用镶嵌化处理技术对网格中的三角形进行细分,以此增加三角形的数量。再将这些新增的三角形偏移到适当的位置,使得网格表现出更加细腻的细节。
几何着色器:
将形状(图元)划分为更多的形状(图元),影响后面的插值结果,例如可以将一个复杂的图形,转换为一个大规模旋转三角面片的组合图形,然后进行一个几何着色器的分片过程。
裁剪:
将处于屏幕与屏幕外直接的三角形进行裁剪。
光栅化阶段:
视口变换(Direct龙书是写在光栅化阶段,但事实上在透视投影变换矩阵中就进行了视口变换):
将齐次裁剪空间的X,Y坐标对应在规格化设备坐标中(NDC)。
背面剔除:
将背面的三角形踢出渲染流程。
顶点属性插值:
通过顶点,为三角形内部像素点进行插值,便于附加纹理,颜色等数据。
注意要使用透视校正插值,因为在3D空间内,纹理坐标与3D线段是线性相关的,但投影到屏幕,就变成了非线性相关,所以要计算相对应的非线性插值。
像素着色器阶段:
对每个像素的颜色进行计算,包括光照,纹理等等。