《Real time rending》 3rd 学习笔记(第二章)
1.摘要
2 图形渲染管线 渲染管线的主要功能是通过给定一个虚拟摄像机,三维空间内的物体,光影,着色方程(shading equation),纹理和其他信息,创建或渲染一张二维图像。
2.
2 图形渲染管线
渲染管线的主要功能是通过给定一个虚拟摄像机,三维空间内的物体,光影,着色方程(shading equation),纹理和其他信息,创建或渲染一张二维图像。
绘制线条的算法:Bresenham’s line-drawing algorithm、symmetric double-step algorithm
有关基础绘图算法参考书《计算机图形学的算法基础]. Procedural Elements of Computer Graphics》(Rogers)
2.1.
2.1 结构
实时渲染管线大致可以分三个阶段:程序(application)、几何体(geometry)、光栅器(rasterizer)
程序阶段(Application stage)由程序驱动,因此由软件实现并在cpu上执行。Cpu通常包括多个核心,所以可以并行执行多个线程。在cpu上执行的任务包括碰撞检测(collision detection)、全局加速算法(global acceleration algorithms),动画(animation),物理仿真(physics simulation)等。
几何阶段(Geometry stage)处理变换(transform)、投影(projection)等。这个阶段处理要画什么,怎么画,在哪画的问题。几何阶段通常由包括可很多可编程核心或固定运算硬件的gpu来处理。
光栅器阶段(Rasterizer stage)最终使用前面阶段产生的数据绘制(渲染)图像,as well as any per-pixel computation desired.光栅化阶段完全在GPU上执行。
2.2.
2.2 程序阶段(Application stage)
开发者可以完全控制本阶段。本阶段结束时被送到几何阶段的图形被称作渲染元(rendering primitive),例如点、线、三角形。
碰撞检测(collision detection)经常在这个阶段实现。检测到两个物体碰撞之后将对产生碰撞的物体产生一个反应,并且反应到力反馈设备中。
程序阶段同时处理其他输入,例如键盘鼠标等。
本阶段还包括了纹理动画,变形动画,或者不在其他阶段中执行的运算。
加速算法,例如分层视锥剔除(hierarchical view frustum culling)也在这个阶段实现。
2.3.
2.3 几何阶段(Geometry stage)
几何阶段的主要责任是处理每个多边形和每个顶点的操作。这个阶段可以进一步细分为以下几个功能阶段:对象和视图变换(model and view transform)、顶点着色(vertex shading)、投影(projection)、裁切(clipping)、屏幕映射(screen mapping)
2.3.1.
2.3.1 模型与视图变换(Mode and View Transform)
在显示到屏幕的过程中,一个模型会被变换到多个空间或者坐标系统中。
起初模型属于它本身的模型空间(Model space),每个模型可以与模型变换(model transform)关联,以确定它的位置和方向。
每个模型可以有关联多个模型变换,这样一个场景里可以存在同一个模型的多个坐标、方向和大小都不同的实例(instances),而不需要复制几何体。
物体的坐标系被称作模型坐标系(model coordinate),当模型变换用于这个坐标系后,就称模型被定为到了世界坐标系(world coordinate)或世界空间(world space)。
世界空间是唯一的,经过模型变换后,所有的模型都在同一个世界空间内。
摄影机在世界空间内拥有坐标和方向,为了方便投影和裁切,摄影机和所有模型要经过视图变换(view transform)。
视图变换的目的是把摄影机放变换到原点并使摄影机的方向对准z轴的负半轴(y轴朝上,x轴朝右),这个空间被称作摄影机空间(camera space)或视觉空间(eye space)。
Figure 2.3‑1
2.3.2.
2.3.2 顶点着色(Vertex Shading)
决定光线照射在材质上的效果的操作叫做着色(shading),它包括计算物体的不同点上的着色方程(shading equation)。通常这些运算在几何阶段的模型顶点上被执行,或再像素光栅化时被执行。
一个顶点可以存储多种材质数据,顶点着色的结果被传入光栅化阶段。
2.3.3.
2.3.3 投影(Projection)
投影将可视体(view volume)变换到(-1,-1,-1),(1,1,1)的单位立方体中,这个单位立方体被称作canonical view volume。有两种通常的投影方式,被称作正交(orthographic)和透视图(perspective)投影。
正交投影的主要特点是两条平行的经过变换 (transform) 后仍平行,此处,变换是指平移和缩放的组合。
透视图投影情况下,物体离摄影机越远,投影后就显得越小。这与我们感知物体大小的方式相似。几何学上,可视体被称作frustum,是一个截面为矩形的椎体,同样也被转换到单位立方体中。
正交投影和透视图投影都可以用4*4矩阵构建,完成转换后,模型被称作在标准设备空间(normalized device coordinate)中。
虽然矩阵把一个volume变换到另一个中,但是仍叫做投影。因为显示后,z坐标不保存在生成的图像中。
2.3.4.
2.3.4 裁剪(Clipping)
当一个图元只有部分在可视体内时需要进行裁切。使用投影矩阵意味着变换过的图元被单位立方体裁剪。
除了可视体(view volume)的六个位面之外,使用者还可以定义附加裁剪平面。(见646页)
裁剪阶段通常使用固定操作硬件执行。
2.3.5.
2.3.5 屏幕映射(Screen Mapping)
进入这个阶段时坐标仍然是三维的,图元的x坐标和y坐标被变换到屏幕坐标(screen coordinates)。屏幕坐标和z坐标一起也被称作窗口坐标(window coordinate)。
DX9计算坐标时把0,0定为在像素中心,所以像素[0,9]覆盖了范围[-0.5,9.5),OpenGL和DX10之后的版本把像素中心定在0.5,所以像素[0,9]覆盖了范围[0.0,10.0)。
2.4.
2.4 光栅化阶段
光栅化阶段的目标是计算和设置包围物体的像素。这个过程被称作光栅化(rasterization)或扫描转换(scan conversion),将屏幕空间中的二维顶点(每个顶点包含一个z值)和与顶点关联的着色信息转化成屏幕上的像素。
这个阶段分为:trangle setup,triangle traversal,pixel shading,merging。
2.4.1.
2.4.1 Triangle Setup
这个阶段计算三角形表面的微分(differential)和其他数据。这些数据用于扫描转换和几何阶段产生的各种着色数据的插值。这个过程由专用的固定操作硬件完成。
2.4.2.
2.4.2 Triangle Traversal
Here is where each pixel that has its center(or a sample)covered by the triangle is checked and a fragment generated for the part of the pixel that overlaps the triangle.查找哪些采样(sample)或像素在三角形里的过程叫做三角遍历(triangle traversal)或扫描转换(scan conversion)。每个三角形片元的属性通过三个顶点的插值生成。这些属性包括片元的深度和几何阶段的着色数据。
2.4.3.
2.4.3 像素着色(Pixel Shading)
每个像素的着色运算在这里执行,输入是插值着色数据。结果是一个或多个颜色被传递到下一个阶段。三角形设置和遍历阶段通常通过专用的hardwired silicon,而像素着色通过可编程的GPU核心执行。
像素着色最重要的技术之一是贴图(texturing),意思是把一副图像“粘合”到物体上。图像可以是一维、二维或三维,但二维图像最为通用。
2.4.4.
2.4.4 混合(Merging)
每个像素的信息被保存在颜色缓冲器(color buffer)中,它是一个颜色的矩阵数组。这个阶段的义务是把着色阶段产生的颜色片元和保存在缓冲器中的颜色组合起来。GPU子单元通常并不是完全可编程的,但是它仍然高度可配置,可用多种效果。
这个阶段通常负责可见性解析。这就意味着场景被渲染后,颜色缓冲内应当包含从摄影机方向可见的几何体。大多数显卡使用Z-缓冲(也叫深度缓冲)算法。深度缓冲的大小和结构与颜色缓冲相同,为每个像素保存从摄影机到最近的图形的z值。将图元渲染到像素时,先比较图元的z值和当前像素的z值,只有图元z值比当前像素的z值小时才进行渲染,并更新像素对应的z值。但是,半透明的图元不能按这种方式渲染,它们要在所有不透明图元渲染完成后,再按由远到近的顺序进行渲染。这是z缓冲的主要缺点。
还有另一个通道和缓冲器可以用于过滤和捕获片元信息。Alpha通道(alpha channel)与颜色缓冲相关联并保存每个像素的透明度。传入的片元可以在深度测试之前执行可选的alpha测试(alpha test)。片元的alpha值与参照值比较,如果没有通过测试,就不再进行处理。这个测试通常用于确保全透明的片元不影响z缓冲。
模板缓冲(stencil buffer)是一个画面以外的缓冲,用于记录被渲染的图元的坐标。通常每个像素包含八位,图元可以通过好几种方式被渲染到模板缓冲,缓冲中的内容可以用于控制进入颜色缓冲和z缓冲的渲染。例如在模板缓冲里有个圆形,之后只允许在圆形范围内的图元进入颜色缓冲。模板缓冲是创建特殊效果的强大的工具。这些管线结束时的函数被称作光栅操作(raster operations,ROP)或混合操作(blend operations)。
帧缓冲(frame buffer)通常包括所有缓冲,但有时只包括颜色缓冲和z缓冲。1990年Haeberli和Akeley提出了帧缓冲的另一部分,叫做累计缓冲(accumulation buffer)。在这个缓冲中,图像可以通过一系列操作被累计,例如,一系列显示物体的图像可以被累计和平均化来产生动态模糊效果。
当图元到达并通过光栅器阶段后,通过摄影机方向可以看见的图像被显示在屏幕上。屏幕显示的是颜色缓冲的内容,为了避免让观察者看到图元被光栅化的过程,使用了双倍缓冲(double buffering)技术。这意味着渲染场景在屏幕外的后背缓冲(back buffer)中执行,当场景被渲染在后背缓冲完成后,将后背缓冲和正在显示的前台缓冲(front buffer)做交换,交换在垂直扫描(vertical retrace)的过程中发生。。
2.5.
2.5 管线实例(略)
2.6.
2.6 总结
除了上面这种管线之外还有离线渲染管线(offline rendering pipeline)。电影制作通常使用微多边形(micropolygon)管线;类似建筑预测通常使用的光线跟踪(ray tracing)渲染器的学术研究和预言性渲染(predictive rendering)程序。
固定函数管线不能使用灵活的方式编程,管线的某些部分可以被设置成不同的状态,例如z缓冲测试可以开启或关闭,但它没有能力去使用程序控制不同阶段中被应用的函数的顺序。可编程GPU可以精确的决定在管线的不同子阶段中被应用的操作。
新开发的GPU大部分都属于可编程GPU。
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,转载请注明作者及原网址。
抱歉,暂停评论。