真实感图形绘制中的图形渲染算法
真实感图形绘制中的图形渲染算法:深度缓存、光线追踪与辐射度
2023-10-11
真实感图形绘制
真实感图形绘制是计算机图形学的一个重要组成部分,它综合利用数学、物理学、计算机科学和其它科学知识在计算机图形设备上生成象彩色照片那样的具有真实感的图形。
一般说来,用计算机在图形设备上生成真实感图形必须完成以下四个步骤:
在计算机中构造出所需场景的几何模型,场景的几何模型直接影响图形的复杂性和图形绘制的计算消耗。
将三维几何模型转为二维平面透视投影图。
确定场景中所有可见面,运用隐藏面消隐算法将视域外或被遮挡住的不可见面消去。
计算场景中可见面的颜色,根据光照模型计算可见面投射到观察者眼中的光亮度大小和颜色分量,并将它转换成适合图形设备的颜色值,从而确定屏幕上每一像素的颜色。
真实感图形绘制涉及的关键技术主要包括光照模型、渲染算法,纹理映射,材质设置,颜色量化等方面的内容:
光照模型确定了光在空间的运行规律,是决定图形真实感的一项重要内容。
图形渲染算法包括三大主要算法,分别是扫描线/深度缓存(z-buffer)、光线追踪、辐射度。
纹理映射技术用于生成物体表面的花纹和细微结构,纹理映射大致可分为两类,一类仅用于改变物体表面的图案和颜色,另一类用于改变物体表面的法向量以产生凹凸不平的效果。此外,还可以制作用于改变反射系数和透射系数的纹理,称作反射纹理和透射纹理。
颜色量化是将计算所得到的各原色的光亮度值转化为显示器可以显示的颜色代码的过程,也是决定图像质量好坏的重要因素之一。
图形渲染算法
深度缓存(z-buffer)/扫描线
z-buffer算法占用内存空间较大、生成图像效果较差。但数据结构简单,运算速度快,在速度要求较高的场合仍有广泛的应用。使用z-buffer算法,遇到系统内存紧张的情况,可将显示窗口分为若干块,对每块单独进行z-buffer显示,从而大幅降低系统所需内存、但会增加额外的时间开销。
其算法思想大致如下:

扫描线算法的基本思想是,按扫描行顺序处理一帧画面,在视点和扫描线所决定的扫描平面上解决消隐问题。具体步骤是先把物体各面投影到屏幕上,再计算扫描线与物体各投影面的相交区间。当两个区间在深度方向上重叠时,采用深度测试确定可见部分。
光线追踪
光线跟踪能生成物体的镜面反射、透明、阴影等效果,生成图像质量好,在高真实感图形显示领域应用广泛。光线跟踪的主要缺点是时间开销大,光线跟踪中最费时的运算是线面求交。如果不采取加速措施,线面求交会占据整个光线跟踪计算时间的95%。
如要提高求交速度,在实际实现光线跟踪算法时,可以采取层次包围盒法或空间剖分法对求交过程进行加速。
层次包围盒法
层次包围盒法是基于CSG造型系统的,它的基本思想是在复杂形体外包一个容易求交的包围盒,例如长方体或球体。在光线与复杂物体求交之前,先判断其是否与包围盒相交,只在相交的情况下才将光线与原复杂形体求交,从而节省时间。若原复杂形体由多个部分组成,可以为每个部分分别定义包围盒,构造包围盒树。 对于包围盒树,在线面求交时先从树根结点开始判断包围盒,若光线与根结点的包围盒无交,则与原物体无交。若相交,再判断光线与各子树的包围盒是否相交,按层次访问包围盒。仅当访问到树的叶节点时,才进行求交计算。
空间剖分法
空间剖分法的基本原理是将物体所在的空间剖分为若干个小体素,为每个体素建一张表,以保存在该体素中或部分在该体素中的物体,若一个物体出现在多个体素中,则这多个体素中每个体素的表中都要存储该物体。 光线射出后,先与其遇到的第一个体素中的所有物体求交,若有交且交点在该体素中,则此体素中的最近交点就是系统中所有物体的最近交点,这样就没有必要与其它体素中的物体求交。若在第一个体素中无交,则再判下一个体素,直到找到交点或穿出剖分空间为止。空间剖分法只对射线穿过的体素中的物体进行求交,大大减少了求交次数。 空间剖分法特别适合于离散体、由多个简单形体构成的复杂形体。这样每个体素中的物体求交速度都很快,而且避免了绝大多数不必要的求交计算。
辐射度
根据热辐射理论,一个物体表面所呈现的颜色是由表面向视线方向辐射的光能决定的。一个面片的辐射度(实际发出的能量)等于它作为光源发射的能量与它所反射的能量之和。可用光亮度方程表示如下:
光通量
光通量 F 是指单位时间内通过某一面积的光的能量。
光照度
光照度 E 指的是单位面积的光通量。
光亮度
光亮度也叫光强,用于描述面元朝某方向辐射的光能大小。面元沿某一方向的光亮度$I$ ,定义为面元在这一方向单位投影面积朝单位立体角所发出的光通量。 物体表面向空间给定方向辐射的光强可应用光照模型进行计算。简单的光照模型通常假定物体表面是光滑的且由理想材料构成,因此只考虑光源照射在物体表面产生的反射光,所生成的图形可以模拟处不透明物体表面的明暗过渡,具有一定的真实感效果。复杂的光照模型除了考虑上述因素外,还要考虑周围环境的光对物体表面的影响。 光亮度的计算公式如下: 光亮度的矩阵表示形式如下:

其中, 是面片 辐射的光亮度, 是面片 作为光源的光亮度, 是面片 的漫反射系数。 是形状因子,反映了离开面片 到达面片 的光能占面片 总辐射能的比例。如果各面片相互之间无遮挡,则 可以通过双重面积分求得。如果考虑面片间的遮挡,则积分区域仅为可见的部分,此时形状因子的计算将非常复杂。
针对形状因子的计算,1985年,Cohen等人提出的半立方体法对近似计算形状因子十分有效。该算法利用深度缓存算法,一次计算一个面片,直到计算完所有面片的形状因子。为便于计算形状因子,一般要对系统中的面片进行离散,这使得形状因子的数目也急剧膨胀。设系统中的面片总数为,则形状因子的数目为。
当面片数量较大时,形状因子的计算与存储对系统都是很大的负担。 针对辐射度计算的计算量较大的问题,可以采用逐步求精算法来解决。逐步求精算法不要求将所有的形状因子全计算出来即可得出初步图形,其基本思想是每次只让一个面片辐射能量。光能辐射度的逐步求精算法的每一次迭代过程的基本步骤如下:

在其它图形显示算法里,光源是区别于其它物体分别对待的。而辐射度算法则允许任何面片发射光线,并将所有光源都当成面光源进行处理。辐射度算法能很成功地模拟物体的漫反射,但对高光和镜面反射的处理不太理想,而且在使用辐射度算法之前还必须将物体剖分为许多小的平面片,空间和时间开销都很大。
参考链接
最后更新于
这有帮助吗?