图形学笔记:光栅化图形管线
图形管线是目前使用最为广泛的渲染方式。

图形管线

在图形流水线中,顶点处理模块负责将三维空间中的顶点投影至二维屏幕空间;随后通过光线采样过程确定各图形元素对应屏幕像素,并生成未被填充的片元块;随后进入片元处理阶段对每个片元应用颜色信息;最终将所有片元的颜色信息综合后输出完整画面。
更形象的几张图用来帮助理解,从中可以看到每一个操作的输入和输出。


顶点处理
在顶点处理中,主要用到的技术是坐标变换。

经过多次坐标变化,物体从世界坐标系中最终变换到2D的屏幕上。

其间,还需要剔除视野之外的物体。
光栅化
屏幕由栅格构成,然而经过变换后所得的屏幕空间仍然保持连续性。光栅化具体来说就是将连续的空间分配给每一个离散的像素的过程。
直线
对于直线来说,根据像素中点决定哪个像素在直线上:

三角形
在三角形中,采用质心坐标系求取每个像素的(\alpha, \beta, \gamma)参数,并随后完成插值运算。

片段处理

在光栅化步骤得到的片段是没有颜色的,在片段处理阶段给像素着色。
抗锯齿
锯齿的根本原因在于频谱混叠,解决办法是超采样和使用重建滤波器。
着色
颜色处理过程主要涉及光线的本质特征。在光线追踪应用中与光照模型相仿的方式下,则需要考虑包括环境光、漫反射和镜面反射这三种基本类型的不同光源特性
每个像素处的颜色为:
定义为c_r的是在每一个像素位置上所具有的纹理特性。该值不仅可以通过顶点颜色插值得到精确计算的结果,而且还可以通过直接查询预先生成的纹理图来快速获取。
纹理映射
为了确定每个像素对应的纹理参数(即所谓的‘纹素’),我们需要将三维模型中的三角形各顶点映射至其所属的二维纹理图像中,并为每一点预设其在该二维空间中的索引位置。具体来说,在三维图形渲染过程中,在处理每一面三角形之前(即所谓的预处理阶段),我们首先要为每条边计算出其在投影方向上的投影长度,并在此基础上求出每条边两端顶点在二维平面中的对应坐标;接着,在主渲染流程中,则要根据这两端顶点在二维平面中的坐标来计算中间各采样点的位置关系,并通过线性插值的方法求得整个面域内各采样点处对应的二维平面坐标;最后,在完成所有必要的计算后,在主渲染流程中才会调用相应的 textures 累加器来获取该面域内各采样点处的真实颜色信息。
需要注意的是,在插值过程中存在一个问题:理论上应当基于三维世界坐标系进行处理;然而目前的做法是直接在屏幕空间中完成该操作;这将导致图像呈现出现透视失真效果;为了消除这种失真效果,在这一阶段应施加透视纠正措施;具体实施方式是首先对坐标数据进行一次矫正处理后再执行常规的插值操作。
在图形处理流水线中,在处理镜面反射和阴影方面同样需要采取相应的措施。其中镜面反射效果主要依赖于环境贴图技术的应用,在实现过程中需要特别注意光线追踪算法的相关优化工作。另外还需要特别关注阴影效果的渲染质量,在实际应用中可以通过改进阴影贴图算法来显著提升整体渲染效率。
在环境贴图的方法中,首先根据每个像素处的法线和入射光方向确定反射光线的方向;然后通过直接查询环境贴图来获取所需的信息。

首先,在光源位置进行计算并生成对应的阴影贴图;接着通过统一的坐标转换手段来确定各顶点的空间位置;随后将计算出的各顶点深度值与预先生成的阴影贴图进行比对分析;最后根据对比结果判断该顶点是否位于阴影区域内。
混合
通过获取颜色块包含的信息内容, 我们能够了解物体表面细节的变化情况. 这些深度信息将被用来决定每个像素的具体亮度值. 其中较为关键的是那些具有较小深度值的部分最先呈现出来. 这一核心处理手段主要采用Z-缓冲法实现.
