管线学习笔记
一. 图形渲染管线 The Graphics Rendering Pipeline
管线的主要功能是根据场景中给定的虚拟相机,三维物体,光源,阴影计算公式,纹理以及更多的元素,生成一幅二维的图像。
三个阶段conceptual stages:application应用,geometry几何,rasterizer光栅化
每个conceptual阶段还可以区分为functional阶段和pipeline阶段。
- application:由应用程序驱动的,以软件的实现方式运行在通用CPUs中。一般地,在CPU中执行的任务主要包括碰撞检测,全局加速算法,动画,物理仿真,以及根据应用程序类型对应的大量其他的任务。
- geometry:主要处理变换,投影等运算。在这个阶段主要计算将要绘制的内容,如何绘制,以及要保存绘制数据的载体。Geometry阶段通常是在一个图形处理单元(GPU)中进行处理的。
- rasterizer:使用前面阶段产生的数据绘制(渲染)一幅图像,与任何per-pixel(针对每个像素)进行计算所期望的结果一致。也在GPU中处理。
1. Application Stage
- 开发人员可以完全控制该阶段的执行过程
- 在application阶段的最后,需要把要渲染的几何图形传递给geometry阶段。这些几何图形也就是rendering primitives(图元),即points,lines和triangles,最终会显示到屏幕上(或者任何其他的输出设备)。这一过程是application阶段最重要的任务。
- collision detection(碰撞检测)
- 处理一些其他的输入源,比如键盘,鼠标,头盔等。
- 实现的其他计算过程包括纹理动画,通过变换得到的动画,或者任何只在该阶段执行的运算。一些常用的加速算法,如分层视域体剔除
2.Geometry Stage
- 主要处理大多数的per-polygon和per-vertex(针对每个多边形和每个顶点)的操作运算。
- 划分为以下几个functional阶段
- model和view transform(模型和视图变换)
- 把该模型变换到到多个不同的空间或坐标系中。
- vertex shading(顶点着色)
- 这种确定一种光源照射到某种材质上的呈现效果的操作过程称为shading(着色)。
- 每一个顶点中可以存储多种不同的材质数据,比如点坐标位置,法向量,颜色值或者任何其他的用于计算着色公式的数据信息。然后,把顶点着色的结果值(包括颜色值,向量,纹理坐标或任何其他类型的着色数据)发送到光栅化阶段进行插值运算。
- projection(投影)
- 投影是指把视域体变换成一个极值点为(-1,-1,-1)和(1,1,1)的单位立方体。
- orthographic(正交)(也称为平行)投影和perspective(透视)投影。
- clipping(裁剪)
- 完全位于视域体之内的图元可以直接传递到下一个阶段。而完全在视域体之外的图元就不会再传递到下一阶段,因为不会渲染这些图元。只有部分位于视域体之内的图元才需要clipping(裁剪)。
- screen mapping(屏幕映射)
- 每一个图元的 x 和 y 坐标会被经过变换以形成screen coordinates(屏幕坐标)。屏幕坐标与 z 坐标结合一起也称为window coordinates(窗口坐标)。
- screen mapping就是先执行一次平移变换,接着执行一次缩放变换。而 z 坐标值不会受到screen mapping操作的影响。变换后的 x 和 y 坐标称为为屏幕坐标。最后,再加上 z 坐标值(−1≤z≤1)(−1≤z≤1)一起传递到rasterizer阶段。
- model和view transform(模型和视图变换)
3.The Rasterizer Stage
- 给定了变换和投影后的顶点,以及与顶点对应的着色数据(全部来自geometry阶段),rasterizer阶段的主要目的是计算并设定物体涵盖的全部像素(图片元素的简称)的颜色值。
- 这个过程称为raterization(光栅处理)或scan conversion(扫描转换),主要是把screen space中的二维顶点—每一个顶点包含一个 z 值(深度值)以及对应的各种各样的着色信息—转换为屏幕上的像素点。
- rasterizer阶段也被划分为多个functional阶段:
- triangle setup(组装三角形)
- 主要计算三角表面的差异以及其他数据。然后使用该数据执行扫描转换,同时还用于执行由geometry阶段产生的各种着色数据的插值运算。
- 这个过程是由固定功能的硬件处理的,固定功能的硬件正是用于完成这些计算任务。
- triangle traversal(遍历三角形)
- 在这个阶段,检查每一个中心(或采样)坐标被三角形覆盖的像素点,并生成一个*fragment(片段)*用于表示覆盖三角形的部分像素点。
- pixel shading(pixel着色)
- 使用作为输入的插值后的shading数据处理任意的per-pixel shading(针对每一个像素进行着色)计算。最终计算的结果是一种或多种颜色值,并被传递到下一个阶段。
- merging(合并)
- 每一个像素的信息都存储在*color buffer(颜色值缓存)*中,该buffer是一个颜色值(每一个颜色值由红,绿,蓝分量组成)的矩阵数组。
- 在merging阶段主要负责把shading阶段产生的片段颜色值与color buffer中当前存储的颜色值进行合并。
- buffer是一种与color buffer具有相同大小的形状的缓存,对于每一个像素存储了从相机到当前最近的图元之间的z-value(距离)。
- triangle setup(组装三角形)
二. GPU渲染管线与可编程着色器
GPU实现了第二章中描述的几何和光栅化概念管线阶段。其被分为一些不同程度的可配置性和可编程性的硬件阶段。
-
绿色的阶段都是完全可编程的。
-
黄色的阶段可配置,但不可编程。
-
蓝色的阶段完全固定。
-
顶点着色器(The Vertex Shader)是完全可编程的阶段,顶点着色器可以对每个顶点进行诸如变换和变形在内的很多操作,提供了修改/创建/忽略顶点相关属性的功能,这些顶点属性包括颜色、法线、纹理坐标和位置。顶点着色器的必须完成的任务是将顶点从模型空间转换到齐次裁剪空间。
-
几何着色器(The Geometry Shader)位于顶点着色器之后,允许GPU高效地创建和销毁几何图元。几何着色器是可选的,完全可编程的阶段,主要对图元(点、线、三角形)的顶点进行操作。几何着色器接收顶点着色器的输出作为输入,通过高效的几何运算,将数据输出,数据随后经过几何阶段和光栅化阶段的其他处理后,会发送给片段着色器。
-
裁剪(Clipping)属于可配置的功能阶段,在此阶段可选运行的裁剪方式,以及添加自定义的裁剪面。
-
屏幕映射(Screen Mapping)、三角形设置(Triangle Setup)和三角形遍历(Triangle Traversal)阶段是固定功能阶段。
-
像素着色器(Pixel Shader,Direct3D中的叫法)常常又称为片断着色器,片元着色器(Fragment Shader,OpenGL中的叫法),是完全可编程的阶段,主要作用是进行像素的处理,让复杂的着色方程在每一个像素上执行。
-
合并阶段(The Merger Stage)处于完全可编程和固定功能之间,尽管不能编程,但是高度可配置,可以进行一系列的操作。其除了进行合并操作,还分管颜色修改(Color Modifying),Z缓冲(Z-buffer),混合(Blend),模板(Stencil)和相关缓存的处理。
1. 顶点着色器
顶点着色器提供了修改,创建,或者忽略与每个多边形顶点相关的值的方式,例如其颜色,法线,纹理坐标和位置。通常,顶点着色器程序将顶点从模型空间(Model Space)变换到齐次裁剪空间(Homogeneous Clip Space),并且,一个顶点着色器至少且必须输出此变换位置。
- 传入的每个顶点由顶点着色器程序处理,然后输出一些在三角形或直线上进行插值后获得的值。
- 顶点着色器既不能创建也不能消除顶点,并且由一个顶点生成的结果不能传递到另一个顶点。
- 由于每个顶点都被独立处理,所以GPU上的任何数量的着色器处理器都可以并行地应用到传入的顶点流上。
2. 几何着色器
- 几何着色器(Geometry Shader)是顶点和片段着色器之间一个可选的着色器
- 几何着色器的输入是单个对象及对象相关的顶点,而对象通常是网格中的三角形,线段或简单的点。
- 几何着色器可以改变新传递进来的图元的拓扑结构,且几何着色器可以接收任何拓扑类型的图元,但是只能输出点、折线(line strip)和三角形条(triangle strips)。
- 几何着色器需要图元作为输入,在处理过程中他可以将这个图元整个丢弃或者输出一个或更多的图元(也就是说它可以产生比它得到的更多或更少的顶点)。这个能力被叫做几何增长(growing geometry)。
3. 像素着色器
- 用于进行逐像素计算颜色的操作,让复杂的着色方程在每一个像素上执行。
- 像素着色器是光栅化阶段的主要步骤之一
- 像素着色器常用来处理场景光照和与之相关的效果,如凸凹纹理映射和调色。
- 对于一个像素,片断着色器可能会被调用若干次来决定它最终的颜色,那些被遮挡的物体也会被计算,直到最后的深度缓冲才将各物体前后排序。