图形绘制管线描述GPU渲染流程,即“给定视点、三维物体、光源、照明模式和纹理等元素,如何绘制一幅二维图像”
坐标类型:模型坐标空间(Object space),世界坐标系空间(World space),观察坐标空间(Eye space),屏幕坐标空间(Clip and Project space)
object space的两层含义:(1)object space coordinate就是模型文件中的顶点值(2)object space coordinate与其它物体没有任何参照关系,这是将object space coordinate和world space coordinate区分开来的关键。无论在现实世界还是在计算机的虚拟空间中,物体都必须和一个固定的坐标原点进行参照才能确定自己所在的位置,这是world space coordinate的实际意义所在。
从object space coordinate到world space coordinate的变换过程有一个四阶矩阵控制,成为world matrix。法向量从object space到world space的转换矩阵是world space的转置矩阵的逆矩阵。
所谓eye space,即以camera(视点或相机)为原点,由视线方向、视角和远近平面,共同组成一个梯形体的三维空间,称之为viewing frustum(视锥)
从视点坐标空间到屏幕坐标空间由三部分组成:
1、用透视变换矩阵把顶点从视锥体中变换到裁剪空间的CVV(规范立方体,canonical view colume)中
2、在CVV中进行图元裁剪
3、屏幕映射:将经过上述过程得到的坐标映射到屏幕坐标系上
把定点从viewing frustum变换到CVV中,这个过程就是投影,投影的方法有两种:正投影(平行投影)和透视投影
primitive assembly,图元装配,即将顶点根据primitive(原始的连接关系)还原出网格结构。
光栅化:决定哪些像素被集合图元覆盖的过程。
pixel operation包括:
1、消除遮挡面
2、texture operations:纹理操作,也就是根据像素的纹理坐标,查询对应的纹理值
3、blending,混色,根据目前已经画好的颜色,与正在计算的颜色的透明度,混合成两种颜色,作为新颜色的输出,通常称为alpha混合技术。
4、filtering,将正在计算的颜色经过某种Filtering(滤波或者滤镜)后输出。可以理解为经过一种数学运算后变成新的颜色值
Z Buffer又称为depth buffer,即深度缓冲区,其中存放的是视点到每个像素所对应空间点的距离衡量。可以用z buffer来判断空间点的遮挡关系。
Z精度之所以重要,是因为Z值决定了物体之间的相互关系,如果没有足够的精度,则两个相距很近的物体将会出现随机遮挡的现象,这种现象通常称为flimmering或z-fighting
stencil buffer称为模板缓冲区,它是一个额外的buffer,通常附加到z buffer中。,每个像素对应一个stencil buffer。在一个stencil buffer中存放1,表示该像素对应的空间点处于阴影体中。
frame buffer称为帧缓冲器,用于存放显示输出的数据,frame buffer通常都在显卡上,但是有时显卡会集成到主板上,所以这种情况下frame buffer被存放在内存区域。
GPU编程技术的发展本质上还是图形硬件的发展。
shader language的发展方向是设计出在便捷性方面可以和C++/JAVA相比的高级语言,赋予程序员灵活而方便的编程方式并尽可能的控制渲染过程,同时利用硬件的并行性,提高算法的效率。
shader language目前主要有3种语言,基于OpenGL的GLSL,基于Direct3D的HLSL,还有NVIDIA公司的Cg语言。
顶点着色器控制顶点坐标转换过程,片段着色器控制像素颜色计算过程。前者是后者的输入。
什么是片段?片段和像素有什么不一样?所谓片段就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的额像素都是经过深度值比较的
Cg profile定义了一个被特定图形硬件或API所支持的Cg语言子集。
函数的递归调用在Cg语言中是禁止的
语义(semantics)是两个处理阶段(顶点程序和片段程序)之间的输入/输出数据和寄存器之间的桥梁,同时语义也表示数据的含义。
顶点着色程序必须声明一个输出变量,并绑定POSITION语义词,该变量中的数据将被用于且只被用于光栅化。
TEXCOORD系列的语义词通常被用于从顶点程序向片段程序之间传递数据
片段着色程序必须声明一个out向量(三元或四元),绑定语义词COLOR,这个值将被用作该片段的最终颜色值
函数ddx和ddy用于求取相邻像素间某属性的差值,输入参数通常是纹理坐标。由于是作用于像素级的,所以只能被片段程序所支持。
光在真空中的速度c与在透明介质中的速度v之比,称为该介质的绝对折射率。光在真空中的折射率等于1。通常我们认为光在空气中的折射率也近似为1。
fresnel折射系数反应的是光在透明介质表面被折射的光通量的比率。
环境贴图(Environment Mapping又称为反射贴图,Reflection Mapping)用于模拟光滑表面对周围场景的映射效果
投影纹理映射一般比喻为:纹理好比一张幻灯片,灯光好比投影机,然后将纹理投影到一个物体上,类似于投影机将幻灯片投影到墙上,这个比喻没有太大的问题,问题是这个比喻刚好颠倒了算法的实现流程。
投影纹理映射的真正流程是根据摄像机(视点相机)的位置、投影角度、物体的坐标,求出每个顶点所对应的纹理坐标,然后一局纹理坐标去查询“纹理值”,也就是说,不是将纹理投影到墙上,二十把墙投影到纹理上。投影纹理坐标的求得,也与纹理本身没有关系,而是由投影机的位置、角度、以及3D模型的顶点坐标所决定。
Depth map中像素点记录的深度值记为lenth_1,然后从视点出发,计算物体顶点v到光源的距离,记为lenth_2,比较length_1和length_2的大小,如果length_1 < length_2,说明顶点v对应的depth texure上的像素点记录的深度值并不是v到光源的距离,而是v和光源中间某个点到光源的距离,这意味着v被遮挡。
depth texure保存的是从视点到物体顶点的距离通常成为深度值。
使用shadow map技术渲染阴影主要分为两个过程:生成depth map和使用depth map进行阴影渲染
生成depth map的流程分为:
1、以光源所在位置为相机位置,光线发射方向为观察方向进行相机参数设置
2、将世界视点投影矩阵worldViewProjMatrix传入顶点着色程序中,并在其中计算每个点的投影坐标,投影坐标的Z值即为深度值。在片段shadow程序中将深度值进行归一化,然后将深度值复制给颜色值
3、从frame buffer中读取颜色值,并渲染到一张纹理上,就得到了depth map。
使用depth map进行阴影渲染的流程为:
1、将纹理投影矩阵传入顶点着色程序中,根据纹理投影矩阵和模型空间的顶点坐标,计算投影纹理坐标和点过点顶点距离光源的深度值length_2
2、将depth map传入片段着色程序中,并根据计算好的投影纹理坐标,从中获取颜色信息,该颜色信息就是深度图中保存的深度值length_1
3、比较两个深度值的大小,若length_1 > length_2,则当前片段在阴影中,否则当前片段接受光照射。
纹理的2、3维之分本质上是根据其描述的数据维数而定的,所谓2d texture指的是纹理只描述 了空间的面数据,而3d texture则是描述了空间中的3维数据,3d texture的另一个学术化的名称是: volume texture
光线投射方法是基于图像序列的直接体绘制算法。从图像的每一个像素,沿固定方向(通常是视线方向)发射一条射线,光线穿越整个图像序列,并在这个过程中,对图像序列进行采样获取颜色信息,同时根据光线吸收模型将颜色值进行累加,直至光线穿越整个图像序列,最后得到的颜色值就是渲染图像的颜色。
光线跟踪算法中光线的方向是从视点到屏幕像素引射线,并要进行射线和场景实体的求交判断和计算,而光线投射算法,是从视点到物体上一点引射线,不必进行射线和物体的求交判断。
直接体绘制算法中的光学模型有:
1、吸收模型(absorption only):将体数据当作由冷、黑的体素组成,这些体素对光线只是吸收,本身既不发射光线,也不反射、透射光线。
2、发射模型(emission only):体数据中的体素只是发射光线,不吸收光线。
3、吸收和发射模型(absorption plus emission):应用最为广泛,体数据中的体素本身发射光线,并且可以吸收光线,但不对光线进行反射和透射。
4、散射和阴影模型(scattering and shading/shadowing):体素可以散射(反射和折射)外部光源的光线,并且由于体素之间的遮挡关系,可以产生阴影
5、多散射模型(multiple scattering):光线在被眼睛观察之前,可以被多个体素散射
在体绘制中需要一个三维模型模型作为体纹理的载体,体纹理通过纹理坐标(三维)和模型进行对应,然后由视点向模型上的点引射线,该射线穿越模型空间等价于射线穿越了体纹理
透明物体的渲染本质上是将透明物体的颜色和其后物体的颜色进行混合,这被成为alpha混合技术。
仿射变换就是线性变换
将三元向量扩充到四元向量,可以用来区分空间向量与空间点的数学表达,在此基础上通过四阶矩阵运算,将空间点的平移、旋转、缩放等操作统一到矩阵的乘法运算中。
CT是计算机X线断层摄影机或计算机X线断层摄影术的简称。
思考题:
1、顶点和向量的齐次坐标有什么不同?齐次坐标的本质是什么?