Direct3D 12入门教程之 ---- 渲染流水线介绍

本文主要参考 《DirectX 12 3D游戏开发实战》一书,
以及微软官方的Direct3D 12示例:DirectX-Graphics-Samples

渲染流水线:又称渲染管线,指的是将3D场景变换至2D场景的处理流程,具体由以下流程:
在这里插入图片描述
这幅图就展示了整个Direct3D的渲染流程,有必要记住图内的一些名词以及缩写,后面会经常使用到。

注,这里面我目前对外壳着色器和域着色器尚不了解,书中也还没有提到,暂且不谈

  • 输入装配器阶段(Input Assembler,IA):从显存中读取几何数据(顶点和索引),并依据指定的图元拓扑将他们装配为几何图元(geometric primitive).关于图元拓扑,可以详见:图形学基础概念------图元拓扑
    在这个阶段中,我们需要通过顶点缓冲区(vertex buffer)的数据结构,将顶点与渲染流水线进行绑定,顶点缓冲区使用连续的内存来存储一系列的顶点。(这里的内存指的是CPU端的内存,而非GPU端的显存)

在绘制几何体时,大多顶点数据是重复的,比如绘制立方体时,仅有8个顶点,却有12个三角形,意味着,若我们使用顶点表示此立方体,需要24个顶点数据,这是一个极大的浪费,想象一下,若场景中有1w个这样的立方体,全部使用顶点进行表示,得多使用10000*16个顶点数据的内存大小,每个顶点数据又是一个4维的座标向量,这个多使用的内存就很可观了,

如果使用顶点索引的形式来表示立方体,我们就只需要存储8个顶点,给出24个顶点索引即可,每个索引是一个整形,这样就极大的降低了内存的消耗,使用顶点索引的方式相当于消耗了 8+24/4 = 14个顶点数据的内存,每个立方体相比顶点表示降低了10个顶点数据的内存消耗,除了内存消耗,也可以让图形硬件不用重复处理同一个顶点数据,毕竟着色器可是会中式的处理每个顶点的。

使用顶点索引相比使用顶点数据的好处有:

  • 索引皆是简单的整数,不会像使用整个顶点结构体那样占用更多的内存
  • 若辅以适当的顶点缓存排序,则图形硬件将不必再次处理重复使用的顶点,从缓存中直接取得即可,
    关于第二点,想象一下,使用顶点表示立方体有24个顶点,意味着硬件要处理24个顶点,其中有16个重复处理的,而使用索引时,仅需要处理8个顶点,并且可以将其缓存下来,对这8个顶点重复使用即可
  • 顶点着色器阶段(Vertex Shader Stage,简记作VS):我们可以把顶点着色器看作是一种输入与输出均为单个顶点的函数,每个要被绘制的顶点都须经过顶点着色器的处理后再送往后续的阶段,
    在顶点着色器中,我们不但可以访问顶点数据,也能访问纹理以及其他存于显存中的数据
    一般而言,我们会需要在顶点着色中对顶点座标进行一系列变换:世界变换(将模型的局部座标转换到全局场景中)->取景变换(将世界空间内的座标转换为观察空间中的座标)->投影变换(将3D顶点投影到2D平面上)

事实上,我们可以认为在硬件中执行的是一下处理过程:
for(UINT i=0;i<numVertices; ++i)
outputVertex[i] = VertexShader(inputVertex[i]);
而其中的VertexShader函数就是我们需要在顶点着色器中实现的内容

  • 曲面细分阶段(tessellation stages):利用镶嵌化处理技术对网格中的三角形进行细分(subdivide),以此来增加物体表面上的三角形数量,再将这些新增的三角形偏移到合适的位置,使得网格表现出更加细腻的细节。

可以通过曲面细分实现lLOD(level-of-detail)
曲面细分是Direct 3D 11中新引入的处理阶段

  • 几何着色器阶段(Geometry Shader Stage,GS):是一个可选的渲染阶段,几何着色器接受的输入应该是完整的图元,可以创建或销毁几何体,比如可以将输入的图元拓展为一个或多个其他图元,或者依据某些条件不输出任何图元。顶点着色器与之相比,则不能创建顶点:仅能接受输入的单个顶点,处理后将顶点输出。

可以注意上面的 “流输出(stream-out)”阶段的箭头,意味着,几何着色器能够为后续的绘制操作将顶点数据流输出值显存中的某个缓冲区之内。

  • 裁剪:裁剪在可视范围外的顶点

  • 光栅化阶段(Rasterization Stage RS):为最终投影至平面上的3D三角形计算对应像素的颜色

    • 视口变换:裁剪完后,硬件通过投影变换将3D顶点变换为2D顶点,需要将2D顶点变换到指定屏幕区域内,这个变换过程称为视口变换
    • 背面剔除:用于将背面朝向的三角形从渲染流水线中除去,在Direct3D中默认情况下,以观察者的视角把顺时针绕序的三角形看成正面朝向,逆时针绕序的三角形当成背面朝向(可以通过对渲染状态的设置,将这个反过来)
    • 顶点属性插值 :到目前为止,我们得到的依然是顶点图元,为了填充屏幕上的像素点,我们需要利用三角形顶点的属性值计算出内部的像素的属性值,也就是插值法
  • 像素着色器阶段(Pixel Shader, PS):针对每个像素片段(pixel fragment,也称片元),进行处理,即每个像素需要执行以此像素着色器。

  • 输出合并阶段(Output Merger, OM):在此阶段中,一些像素片段可能会被丢弃,比如那些未通过深度缓冲区测试或者模板缓冲区测试的像素片段,剩下来的像素会被写入后台缓冲区中,混合(blend, 也称融合)操作也是在此阶段实现的,此技术可以让当前处理的像素与后台缓冲区对应像素相融合,而不仅是对后者进行完全的覆写,


这里面有些概念还是理解不够清晰,以后完全理解了回来进一步解释

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章