大规模三维场景绘制关键技术研究

2021-06-15 07:20林亚军刘剑超
指挥控制与仿真 2021年3期
关键词:缓冲区着色光照

林亚军,刘剑超,王 伟

(海军航空大学教练机模拟训练中心,辽宁 葫芦岛 125001)

大规模三维场景绘制是实时绘制领域的一个重要问题,大规模户外场景的绘制需求在多种应用系统中皆有体现。例如,三维地理信息可视化系统为了在表达基本的地理信息数据之外,进一步加强系统的表现力,常常需要在较大的空间尺度下实现大气、海洋、云层等自然效果,以增强可视化系统的真实感[1]。飞行模拟器视景系统要实现高空视野开阔条件下生成高度真实感的图像,也离不开大规模的城市场景和自然环境的真实感绘制技术。

虚拟现实在飞行器驾驶培训领域的应用由来已久,而大规模户外场景的实时绘制是视景系统要提供的重要内容。为了加强场景的表现力,除了基本的地形与场景模型绘制外,还要在较大的空间尺度下实现大气、雨雪、烟雾等自然效果。现实中,飞行经常受到不同天气状况的影响,在不同的天气条件下,物体所受到的光照是不同的,反映到计算机图形学中,就是三维场景中的物体在不同的天气环境下的光照计算是不同的[2]。因此,从实际应用出发,面向大规模户外场景的天气渲染系统对于飞行视景是极其必要的。

本文提出了解决重复计算光照问题的延迟着色技术,研究了高效抗锯齿问题的多重采样反走样技术,将其应用于工程项目,有效提升了大规模场景的绘制效果,给飞行员和用户带来了较好的体验。

1 大气散射模型

本文采用的光照算法是基于预计算查找表的大气散射模型,该模型可以准确地模拟大气层中的光照效果[3],例如:日光经过大气散射后对地表上任何一点的直射光;由大气层内的多重散射产生的照射到地表上任何一点的天空光;地表处的反射光经过大气层射入视点过程中的散射衰减;在大气层内散射进入视点的日光,其包括两种效果:一是当视线朝向天空时,体现为天空光效果,二是当视线朝向地面时,体现为远处物体颜色变蓝(白天)/变红(傍晚)的效果。

该大气散射模型提出是为了实时计算地面上的光照效果[4]。在三维场景绘制过程中,包括地形、房屋、车辆在内的所有物体的光照效果均使用该方法计算。

2 延迟着色

在前期大量工作的基础上,发现延迟着色方法与其他绘制流程组织方式相比具有独特的优势。

延迟着色的几何缓冲区设计为参与绘制的各个模块提供了一个一致的数据输出格式,相当于为执行光照计算的模块和其他各模块之间提供了一致的数据交换接口,有助于将各个模块组织到统一的绘制流程之下。

与正向绘制的模式不同,在延迟着色模式下,除了直接进行光照计算的模块之外,其他模块均不需要添加任何光照计算相关的代码。这有助于系统的功能分离,使得光照算法和其他算法可以彼此相对独立地进行开发,可以有效降低系统的开发和维护成本。

采用带有大气散射的光照模型作为主要的光照模型,其计算量和纹理访问量都较大,使用延迟着色模式可以有效降低光照计算的任务量,有助于实现较高的绘制性能。

延迟着色的基本绘制流程如图1所示,图中,圆角矩形表示绘制操作,直角矩形表示数据缓冲区,实线箭头表示数据流向,虚线箭头表示绘制操作的执行顺序。

图1 基本绘制流程

该流程将三维场景中需绘制的对象分为实体三维模型、带折射效果的网格、星空和非实体效果。

实体三维模型:主要指三维场景中的地形、建筑模型、车辆模型等由三角网格构成的具有确定实体形状的对象。这些对象由三角形网格表示,一般不透明,其遮挡关系可以利用深度测试解决。在低分辨率的显示设备上绘制这类对象时常常遇到三角形边缘和交界处的锯齿问题,为了消除这些锯齿现象一般需要采用多重采样等抗锯齿算法。

带折射效果的网格:主要指河面、海面等既具有实体形状,又能对其后的对象(河底、海底、水下物体等)产生折射效果的对象[5]。在实时绘制等对效率要求较高的应用场景中,这类折射效果一般采用屏幕空间图像扰动的方法来近似表现,因此,这类对象的绘制顺序必须排在实体三维模型之后。这类对象通常也用三角形网格进行建模和绘制,在三角形边缘和交界处同样有锯齿问题,因此,也需要采用多重采样抗锯齿算法。

星空:单指夜间的星空。三维场景中的星空一般用环境纹理或者无穷远处的亮点来表现,绘制时不写入有效的深度信息,但是需要执行深度测试以确保星空不会遮挡场景中的其他物体。星空本身属于自发光对象,既可以绘制到几何缓冲区的自发光缓冲区中,也可以作为一个单独的绘制步骤插入延迟着色流程的几何绘制操作和着色操作之间,直接将发光强度写入颜色缓冲区。本文采用第二种做法。

非实体效果:泛指一切不包含在其他三类中的、不以三维网格作为表现形式的对象。例如,粒子效果(降雨、降雪、粒子云)、后处理效果等。这类对象一般没有确定的边界,不存在锯齿问题,可以不使用多重采样方式绘制以提高绘制效率。后处理效果直接操作已经绘制完成的图像,粒子效果则存在半透明粒子的混合问题[6]。因此,二者的绘制顺序都应该排在上述三种对象之后。一般来说,粒子效果虽然没有具体的三维形状,但是粒子本身还是存在于三维场景的某个位置之中。因此,粒子效果的绘制应当放在后处理效果之前。

3 多重采样技术

绘制三维场景时需要使用多重采样技术消除三角形边界上的锯齿效果。多重采样技术最初是针对正向绘制设计的,在延迟着色环境下应用多重采样技术会带来一些问题。多重采样的一个基本假设是同一个像素点内的多个采样点的数据可以通过加权平均得到这个像素上最终呈现的数据。

3.1 算法流程

考虑了多重采样问题后的延迟着色处理流程如图2所示。

图2 多重采样后的延迟着色绘制流程

首先,将场景信息绘制到多重采样的几何缓冲区中,然后,将多重采样的几何缓冲区通过加权平均的方法降采样为单采样的几何缓冲区。在降采样过程中执行上述三条检查,将检查结果记录在额外的多重采样标记缓冲区中。多重采样标记缓冲区是一个与屏幕等大的8 位无符号整数格式的纹理图像,其低三位分别表示该位置的像素是否通过了上述三条检查,如果某条检查表明该像素需要执行多重采样光照,那么对应的位标为1。这样设计的好处是光照计算阶段可以灵活地根据光照算法的特征舍弃某些检查的结果,例如,某个光照算法的计算结果与像素的空间位置无关,只与法向和材质有关,那么使用这一光照算法时,就可以只检查法向和材质对应的判定位,舍弃深度的判定位。使用该策略可以进一步减少需要执行多重采样光照的像素数,提高性能。

3.2 多重采样及其检测方法

3.2.1 面向延迟着色的多重采样策略

图3 法向不连续导致的光照计算错误

同样的问题也发生在深度信息上。如图4所示,E为视点,L为点光源,L周围的圆圈表示它照亮的范围。A、B、E三点共线,A、B两点经过投影变换后落到同一个像素中,在这个像素内部产生了深度不连续[10]。B在L的照亮范围内,因此被照亮,A不在L的照亮范围内,因此不被照亮。要在这个边界处实现像素颜色的平滑过渡,该像素应当填充为完全照亮和完全不照亮之间的过渡值。如果先算出像素内部的平均深度,得到M点,再在M点处计算光照,会得出该像素完全没有被照亮的错误结果。

图4 深度不连续导致的光照计算错误

3.2.2 面向延迟着色的多重采样检测方法

在延迟着色模式下要正确实现多重采样算法,就必须先对每个采样点计算颜色,再对颜色进行加权平均。如果对全屏幕的像素都做这样的处理,那么,需要执行的光照计算任务数量将大大增加。假设系统的几何缓冲区使用8倍多重采样,那么,每个像素点就必须执行8次光照计算。这实际上是放弃了多重采样每个像素只计算一次颜色的性能优势,实际性能等同于超级采样方法。如果光照算法比较复杂,那么系统的绘制效率将急剧下降。显然这样的策略是不可取的。

本文所采取的高效方法是通过进行多重采样的检测,使得只在三角形的边缘或交界处进行采样点的光照计算。如果某个像素完全位于三角形内部,根据多重采样光栅化的规则可知,该像素内部的多个采样点除了深度数据之外都是相同的。对于这些在三角形内部的像素,使用加权平均后的数据进行光照计算并不会带来明显的错误。通常情况下三角形密度不会大于像素的密度(即像素的分辨率),屏幕上位于三角形边缘或交界处的像素总是少数[9]。只在这些像素上执行多重采样光照计算,与不使用多重采样相比,增加的计算量并不是很多,也能起到很好的抗锯齿效果。

该方案的核心问题在于判定某个像素是位于三角形内部,还是位于交界和边缘。这可以通过分析像素内部各采样点的数据实现。本文提出的多重采样检测的判定规则包括以下三条。

1) 法向突变规则

如果一个像素内部的多个采样点中记录的法向不同,那么认为这个像素需要执行多重采样光照计算。

2) 材质突变规则

如果一个像素内部的多个采样点中记录的材质编号不同,那么认为这个像素需要执行多重采样光照计算。

3) 深度突变规则

如果一个像素内部的多个采样点中记录的深度最小值和最大值差异较大,那么认为这个像素需要执行多重采样光照计算。

上述规则并不能严格判定某个像素是否完全位于三角形内部。如果某个像素跨越的两个三角形法向、材质都相同,在空间中距离也较近,就有可能漏过上面的三条检查,被判定为在同一个三角形内[11]。不过,这种情况下使用加权平均后的数据计算光照引起错误的概率较低,对最终的画面效果影响不大。图5为执行深度突变检测所获得的结果,图中白色点即为检测出的内部存在深度突变的像素,而图6为执行所有的检测之后所获得的结果,其中,白色点为检测出的内部存在突变的像素。

图5 多重采样标记(只检测深度突变)

图6 多重采样标记(检测所有突变)

4 大气散射和天空光计算

在延迟着色模式中的第二阶段,即真正的光照计算和着色阶段[12]。这时输入的数据既有多重采样几何缓冲区的数据,又有采样几何缓冲区中的数据,执行称为复合的多重采样的光照计算和着色阶段,所谓复合的多重采样是指在着色器中处理的像素,既有采用多重采样方式进行光照计算的像素,也有采用单采样方式进行光照计算的像素[13]。

当图元的一部分覆盖了像素中的子采样点时,则会执行片元着色器(Fragment Shader或者像素着色器 Pixel Shader),片元着色器的执行不是以子采样点为单位,也就是说不管有多个子采样点,对于每个图元,这个像素只执行一次片元着色器。当颜色缓冲中这些子采样点,填充了所有绘制的图元的颜色时,将取平均值计算最终这个像素的颜色,这个颜色将是唯一值。执行绘制之后的结果如图7所示[14]。

图7 散射绘制的效果图

5 工程实践

根据前面所述大规模场景绘制方法,将算法流程应用于某型飞行模拟器和某型飞机飞行与指挥模拟训练系统工程中,图8和图9为视景系统的场景现象。

图8 某型飞行模拟器视景图

图9 某型飞行与指挥模拟训练系统视景图

经过工程应用,在某飞行模拟器视景中,城市建筑、地面、天空等光照效果效果较好,与现实差距较小,达到了预期期望。

猜你喜欢
缓冲区着色光照
肉种鸡的光照不应性对养殖生产的不良影响分析
着色后的战地照片
隐蔽的力量
10位画家为美术片着色
彭汉钦艺术作品
缓冲区溢出漏洞攻击及其对策探析
水禽舍的光照及其控制
初涉缓冲区
蛋鸭的光照管理
本期导读