一本书除了后面的优化其余的都撸完了一遍,但是实际应用起来好多东西记不清,还有好多东西不懂,东百度西百度,最后发现书
6里就有。。而且总结的很好,所以,我来二刷啦~~~不得不佩服女神,条理清晰,总结到位,这本书真心喜欢。
#
程序员的三大浪漫:编译原理,操作系统,图形学。
程序员中的“外貌协会”
#渲染流水线
#什么是渲流水线
- 渲染流水线的最终目的在于生成或渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。它的输入是一个虚拟摄像机,一些光源,一些shader以及纹理等。
- 对于时时渲染来说,渲染管线就是基础,是底层工具
- 使用流水线的好处:可以提高单位时间的生产量。(最慢的管线阶段决定绘制速度,即图像的更新速度,这一速度一般用FPS来表示,也就是每秒绘制的图像数量,或者用Hz来表示)
#渲染流程的三个阶段:
- 应用阶段(Application),几何阶段(Geometry),光栅化阶段(Rasterizer Stage)。
- (只是概念流水线,与GPU流水线区分开)
- 每个阶段本身也可能是一条管线(几何阶段),此外还可能对有的阶段全部或者部分进行处理化(光栅化阶段),应用程序阶段虽然是一个单独的过程,但仍然可以对之进行管线化或者并行处理
应用阶段:
- CPU实现
- 开发者拥有绝对控制权
- 这一阶段开发者有三个任务:
- 准备场景数据:相机,光源,模型等。
- 粗粒度剔除(Culling)工作:不可见的剔除出去,不需要移交给几何阶段。
- 设置好每个模型的渲染状态:材质,纹理,shader等。
- .重要输出:渲染所需的几何信息,即渲染图元(rendering primitives),这些图元将会被传递给下一阶段--几何阶段。
- 因为该阶段是软件方式实现,因此不能分为若干子阶段。但为了提高性能,该阶段还是可以在几个并行的处理器上同时执行,在CPU设计上,称这种形式为 超标量体系(superscalar) 结构,因为它可以在同一时间做不同的几件事
- 通常实现的方法:碰撞检测,加速算法,输入检测,动画,力反馈以及纹理动画,变换方阵,几何变形,以及一些不在其他阶段执行的计算,如层次次视锥裁剪等加速算法就可以在这里实现
几何阶段(Geometry)
- GPU实现
- 开发者没有绝对控制权
- 工作:和图元打交道,进行逐顶点,逐多边形的操作。
- 功能阶段:
- 模型视点变换(Model & View Transform)
- 顶点着色(Vertex Shading)
- 投影(Projection)
- 裁剪(Clipping)
- 屏幕映射(Screen Mapping)
- 可以分成若干更小的流水线阶段:(根据具体实现,这些阶段和管线阶段等同,也可以不等同,在一些情况下,一系列连续的功能阶段可以形成单个细小的管线阶段)
- 重要任务:把顶点坐标变换到屏幕空间中,再交给光栅化进行处理。
- 输出:屏幕空间的顶点信息(二维顶点坐标,每个顶点的深度值,着色等)
- 几何阶段计算量非常高,只有一个光源的情况下,每个顶点大约需要100次左右的精准的fudian
1.模型视点变换(Model & View Transform)
- 模型变换的变换对象:模型的顶点和法线
- 模型变换:把模型坐标变换到一个统一的,适合渲染的的空间中
- 视点变换:为了方便投影和裁剪,变换为相机空间;
- 相机空间/观察空间:把相机放在原点,然后进行视点校准,使其朝向Z轴负方向,Y轴指向上方,X轴指向右边。变换后实际位置和方向就依赖于当前的API
2.顶点着色(Vertex Shading)
- 着色:(shading)确定材质上的光照效果的操作
- 顶点着色的结果(颜色,向量,纹理坐标或任何其他种类的阴着色数据)计算完成后,会被发送到光栅化阶段进行插值操作
3.投影(Projection)
- 投影操作:将视体变换到一个对角顶点分别是(-1,--1,-1)和(1,1,1)单位立方体(unit cube)内,这个单位立方体通常也被称为规范立方体(Canonical view volume,cvv)。
- 两种投影方法:
- 正交投影(orthography projection,或 parallel projection):把视体变换为单位立方体,平行线变换后仍然平行
- 透视投影(perspective projection):模拟人感知物体的方式,平行线将在地平线处汇聚。
- 正交投影和透视投影都可以通过4x4的矩阵来实现,在任何一种变换之后,都可以认为模型位于归一化处理后的设备坐标系中
- 虽然这些矩阵变换是从一个可视体变换到另一个,但他们仍被称为投影,因为在完成显示后,Z坐标将不会再保存于的得到的投影图片中,通过这种投影方法,就将模型从三维空间投影到了二维空间中
- 投影阶段就是将模型从三维空间投射到二维空间中的过程。
4.裁剪(Clipping)
- 只有当图元完全或部分存在于视体内部时,才需要将其发送到光栅化阶段,这个阶段可以把这些图元绘制到屏幕上。
- 裁剪阶段目的:对部分位于视体内部的图元进行裁剪操作。
5.屏幕映射(Screen Mapping)
- 进入这个阶段
- 主要目的:将之前步骤得到的坐标映射到对应的屏幕坐标系上
光栅化阶段(Rasterizer Stage)
- 也叫扫描变换(scan Conversion),即从二维顶点所处的屏幕空间(所有顶点都包含Z值,即深度值,)
- GPU实现
- 开发者没有绝对控制权
- 工作:对上一阶段得到的逐顶点数据(如纹理坐标,顶点颜色)进行插值,然后进行逐像素处理
- 主要任务:决定每个图元中的哪些像素应该被绘制在屏幕上
- 可以分成若干更小的流水线阶段
- 三角形设定(Triangle Setup)阶段
- 三角形遍历(Triangle traversal)阶段
- 像素着色(Pixel Shading)阶段
- 融合(Merging)阶段
1.三角形设定(Triangle Setup)阶段
- 用来计算三角形表面的差异和三角形表面的其他相关数据,该数据主要用于扫描转换,以及由几何阶段处理的各种着色数据的插值操作所用,该过程在专门为其设计的硬件上执行
2.三角形遍历(Triangle traversal)阶段
- 将进行逐像素检查操作,检查该像素处的像素中心是否由三角形覆盖,而对于有三角形部分重合的像素,将在其重合部分生成片段(fragment)
- 三角形遍历:找到哪些采样点或像素在三角形中的过程
3.像素着色(Pixel Shading)阶段
- 所有逐像素的着色计算都在像素着色阶段进行,纹理贴图操作就是在这个阶段进行的
- 输入:插值得来的着色数据
- 输出:一种或多种将被传送到下一阶段的颜色信息
- 可编程,CPU内执行
- 纹理贴图:(Texturing)将图片贴到指定的物体上的过程,而指定的图片可以是一维,二维,或者三维的。
4.融合(Merging)阶段
- 主要任务:合成当前缓存于缓冲器中的由之前的像素着色阶段产生的片段颜色,此外,还负责可见性(z缓冲相关)的处理
- 通常运行该阶段的子单元并非完全可编程的,但其高度可配置,可支持多种特效
1)Z缓冲:(深度缓冲器)
- Z缓冲器和颜色缓冲器形状大小一样,每个像素都存储着一个Z值,这个Z值是从相机到最近的图元之间的距离,每次将一个图元绘制为相应的像素时需要计算像素位置处图元的Z值,并与同一像素处的Z缓冲器内容进行比较,如果新计算出的Z值远远小于Z缓冲器中的Z值,那么说明即将绘制的图元与相机的距离比原来距离相机最近的图元还要近,这样,像素的Z值和颜色就由当前图元对应的值和颜色进行更新,反之,若计算出的Z值远远大于缓冲器中的Z值,那么z缓冲器和颜色缓冲器中的值就无需改变。
2)alpha通道:
- alpha通道和颜色缓冲联系在一起可以储存一个与每个像素相关的不透明值。
- 可选的alpha测试可在深度测试执行前,在传入片段上运行。
- alpha测试经常用于不影响深度缓存的全透明及片段
3)模板缓冲器(stencil buffer)
- 用于记录所呈现图元位置的离屏缓存,每个像素通常与占用8个位,图元可使用各种方法渲染到模板缓冲器中,而缓冲器中的内容可以控制颜色缓存和z缓存的渲染
- 类似mask的操作,是制作特效的强大工具,而在管线末端的所有这些功能都叫做光栅操作(raster operation,ROP)
4)帧缓冲器(frame buffer)
- 通常包含一个系统所具有的所有缓冲器,但有时也可以认为是颜色缓冲器和z缓冲器的组合
5)累计缓冲(accumulation buffer)
- 是对帧缓冲器的补充
- 可以用一组操作符对图像进行累积,例如,为了产生运动模糊(motion blur)可以对一系类物体运动的图像进行累积和平均,此外,其他的一些可产生的效果包括景深(e depth of field),反走样(antialiasing)和软阴影(soft shadows)等。
- 双缓冲(double buffering)机制:为了避免观察者体验到对图元进行处理并发送到屏幕的过程。屏幕绘制是在一个后置缓冲器(backbuffer)中以离屏的方式进行的。一旦屏幕已在后置缓冲器中绘制,后置缓冲器的内容就不断与已经在屏幕上显示过的前置缓冲器的内容进行交换,注意,只有当不影响显示的时候才进行交换。
#管线纵览与总结
- 在概念上可以将图形渲染管线分为三个阶段:应用程序阶段、几何阶段、光栅化阶段
- 这样的管线结构是 API 和图形硬件十年来以实时渲染应用程序为目标进行演化的结果注意的是这个进化不仅仅是在我们所说的渲染管线中,离线渲染管线(offline renderinpipelines)也是另一种进化的路径。且电影产品的渲染通常使用微多边形管线(microppipelines)。而学术研究和预测渲染的(predictive rendering)应用,比如建筑重建(architectural previsualization)通常采用的是光线跟踪渲染器(ray tracing renderer