1. 引言
大规模的自然场景绘制和渲染在游戏、影视、军事仿真等领域使用颇为广泛,而大规模海洋的模拟更是其中最为复杂和困难的分支之一,与地形不同,海洋的表面形态是动态变化的,细节也更为丰富。这对图形学研究提出了更高的要求。
目前水体模拟方法主要分为基于物理的方法和基于构造的方法,基于物理的方法以Navie-Stokes方程 [1] 为基础,通过忽略一些影响因素进行简化,从而求出水波运动的近似解。该类方法模拟效果较好,但是普遍计算量过大,适用于体积不大的水体的模拟。大规模海洋模拟普遍采用基于构造的方法。较常见的是正余弦波叠加算法 [2]、Gerstner波 [3] 以及快速傅里叶(FFT) [4] 解算Phillips海洋波谱 [5] 的方法等,另外再叠加Perlin噪音 [6] 使波形更为随机,缓解重复采样带来的重复感觉。FFT算法的计算量虽然较其他波算法的计算量大,但是模拟海洋的波形较为真实。
对于大面积的网格实时绘制,多层次细节网格模型(LOD) [7] 的选择至关重要,目前主要的LOD有四叉树模型 [8]、放射状模型 [9] 和投影网格模型 [10]。四叉树模型将不同精度的网格数据存储在四叉树中,根据视点的位置遍历四叉树获取需要绘制的网格。在不同层次的交界处,视点的移动会引起层次的变化容易造成网格的突变;同心圆模型以视点在海平面的投影为圆心,以递增的半径做多个同心圆网格来构建网格,该方法的细节层次取决于顶点到视点的水平距离,所以在视点上下移动时,网格不会发生变化;投影网格模型在屏幕空间划分网格,再投影到世界空间的水平面上,顶点数量不会变化,与场景复杂度和视点位置无关,所以在所有方法中顶点规模最少,在屏幕上分布最均匀。
随着DirectX11以上版本对曲面细分的支持,该技术被广泛应用到模型网格的渲染开发中。在投影网格的基础上使用曲面细分着色器对原始网格进行进一步细分,增加网格的精细度以及顶点的数量,可以带来更好的效果。王艳芳等人提出基于屏幕空间的网格自适应精化方法 [11],在网格模型上使用曲面细分技术,将坐标置换后的顶点再一次转换回屏幕空间,对置换后面积较大的网格进行细分,使得置换后的网格在屏幕空间内依然保持均匀,缓解了细节丢失现象,该方案的细分目的是保证网格在屏幕中的均匀性,为了进一步增加海洋网格的局部细节,本文提出新的优化方案,摒弃了传统投影网格的屏幕分布均匀性,使用曲面细分技术对起伏变化较大的网格区域进行不同程度的细分,有针对性的增加海洋网格的细节表现。
2. 投影网格模型
2.1. 基础投影网格
如图1所示,首先将屏幕空间划分生成均匀采样网格,其最大分辨率由显卡的渲染性能决定。可编程渲染管线的顶点着色器将从视点发出的投射光线穿过视口的采样网格,与一个基底平面相交,交点即为网格顶点的世界坐标。然后将顶点移动到交点位置,生成原始网格。
通过相机的视矩阵和投影矩阵可以把一个点从世界空间转换到投影空间。
(1)
其中
是世界坐标,
是投影空间坐标,
是投影矩阵的逆矩阵,
是视图矩阵的逆矩阵。
因为采样网格基于屏幕空间进行划分的,所以采样网格的大小和数目固定不变。固定的采样网格可以存储在显存中,直接作为顶点处理器的输入数据。由于只在开始传输生成的采样网格,而不是在每一帧中都传输一次网格,因而有效地减少了处理器和显卡之间的传输开销。顶点缓冲区直接把数据加载到显卡的显存里,降低了渲染的时间。另外,由于在每一帧中只对固定数目的三角网格进行投射计算以及渲染,因而在整个渲染过程中帧率较为稳定。
该方法计算速度较快,适用于大规模海面和地形的绘制,但是也存在缺陷,在对投影网格进行坐标置换后,再转换回投影空间可能无法覆盖整个屏幕,原屏幕上下边缘的顶点在上下移动后会在原来的位置产生空隙。此外当摄像机的朝向和水平面平行或者夹角大于90度的时候,此时交点在相机背后而不是在它的前面,无法求出正确的交点。在海面的模拟中,由于投影网格模型的特性,网格无论在平缓还是起伏较大的区域都是均匀一致的,不能够针对起伏处需要更多细节表现的地方增加网格的精细度。
2.2. 改进的投影网格
针对特殊情况无法求出正确交点以及产生空隙的问题,目前主要的解决方法是增加一个垂直于海面的辅助相机,强制放大投影网格作用区域来弥补空白区域,但其会降低网格原有的层次细节,影响海面绘制的精细度。
图2是Johanson提出的一种改进方法 [12]。该方法在主相机的上方增加了一个副相机projector,projector的视椎体覆盖范围大于并包含了主相机,增加的区域即是空隙的部分,网格的绘制过程使用projector进行计算。设定了波峰的最大高度up,波谷的最低高度down,使projector始终处于up之上且始终朝向水面,这样解决了相机距离水平面过近或者角度不合适时无法正确求交的问题。获取摄像机视椎体和这两个平面的交集,投影到水平面base的总区域AB。此区域即是projector在水平面的截面,
为投影到水平面的顶点坐标。
通过公式(2)可以求得projector的投影矩阵。
(2)
是得到的坐标;
是Projector的View Matrix;
是Camera的Project Matrix得到最大的
和最小的
,如果是以水平面base计算交点的话,
和
都会是在[−1, 1]的范围,但是以down和up计算的交点的话,那么
和
的值域会稍稍超出[−1, 1]。需要做一个修正,将Camera投影空间的Grid坐标变换到
这个范围内。
(3)
(4)
(5)
是Camera的投影矩阵这样副相机projector的视椎体完全覆盖主像机所能看见的网格的原始区域。
Johanson的改进投影网格方法有效的解决了原始投影网格方法的主要缺陷,但是其将视口的均匀采样网格的水平投影映射到了较大的区域,产生了拉伸,使得变换后的网格是非均匀的,且网格变大,精细度降低。我在该方法基础上进行了调整,在通过主相机计算确定副相机的视椎体后,以副相机作为网格投射相机,计算顶点在水平的投影坐标,生成投影网格。
3. 生成置换纹理
海浪统计学模型依据对海浪实际观测的统计学结果,将海浪高度场分解为一系列具有不同振幅、频率、相位和方向的正弦波或余弦波。我采用的是Philips谱函数:
。 (6)
利用2D快速傅里叶逆变换(IFFT)的快速算法,就可以计算出任意时间的随机波幅高度。的大小决定了海浪移动的快慢,在进行海浪的模拟时,视觉上看到的是海浪的起伏变化快慢,而风速的大小,可以控制海浪的振幅,风向决定了海浪移动的方向 [13]。将计算结果的xyz方向偏移量存入置换纹理的rgb通道,Dupuy [14] 等人提出可以利用雅可比行列式来求得每一个顶点的运动撕扯程度。
(7)
为每个顶点计算jacobi值并存入a通道,最后将置换纹理传给曲面细分着色器使用。
4. 曲面细分
Tessellation (曲面细分)是一种将多边形网格拆解成更细小的网格来提升几何形状逼真度的方法,在顶点与顶点之间自动嵌入新的顶点,并在网格内部重新划分网格单元。曲面细分通过图形处理器自动创造出数百倍与原始模型的顶点,这些顶点的效果等同于CPU传入的顶点,坐标可以被修改。在细分出更多细小网格之后,模型的曲面会变得非常平滑细腻,从而获得更好画面效果的技术。
在大规模海洋模拟中只使用投影网格的话,俯视观察整个网格,平缓和起伏大的不同区域网格也是基本一致的,如果为了更细致的绘制起伏变化大的区域而增加整个网格的精度,那么用数量较多的网格绘制平缓区域显然是没有必要的且会显著增加开销。为了解决这个问题,在投影网格的基础上使用曲面细分着色器,首先使用较粗糙的投影网格作为渲染管线的绘制输入,在顶点着色器中将网格投影到水平面上,世界坐标的xz坐标作为uv纹理坐标。然后在曲面细分着色器中从置换纹理中用uv坐标读取颜色,透明度通道的值即Jacobi值。该值的范围在0到1之间,值越小表示撕裂程度越大,所以将该值的倒数乘以设定的倍率t作为细分系数p:
(8)
只对三个顶点的中心点的细分系数超过设定阈值k的三角网格进行细分,细分系数越大细分程度越高。最后使用置换纹理采样得到的rgb的值修改顶点的坐标,对细分后的网格进行坐标置换生成起伏的波浪。
5. 实验结果与分析
本文实验的实验设备为笔记本电脑,处理器为Intel Core i7-7700HQ,显卡为NVIDIA GeForce GTX1050。编程环境为Visual Studio 2019,渲染环境为Unity 2019。
未使用曲面细分
使用细分倍率为5的曲面细分
Figure 3. Grid rendering
图3. 网格效果图
设置采样网格大小128*128,使用改进的投影网格方法生成原始网格,为曲面细分着色器的细分倍率设置不同的输入参数,并记录平均帧率。实际表现如图3所示,图3(a)为未使用曲面细分的网格,图3(b)为使用了曲面细分,细分倍率设置为5的网格,可以看到使用了曲面细分的网格方案有针对性的增加了起伏变化较大区域的网格密集度,提高了波浪的细节丰富度。而平缓的区域和未使用曲面细分的模型网格数量基本一致。
表1为不同细分倍率下在一分钟内测得的每秒平均帧率,细分倍率为1时不对网格进行细分即为进行改进的原始海洋网格,以细分倍率5为例,帧率降低了2.3%,顶点数量增加了30%,以很少的性能损耗提升了较多的精细度。在细分倍率低于10的情况下,帧率降低不明显,且效果较为合适,过高的细分倍率产生的极为细密的网格几乎无法观察到,对效果提升很小,且帧率下降严重。

Table 1. Frames per second at different tessellation rates
表1. 不同细分倍率的帧率
6. 结束语
以上对大规模海洋的网格生成方法进行了研究,利用Compute Shader,使用IFFT算法解算Philips频谱生成海洋波形的置换纹理,在改进的投影网格基础上引入曲面细分技术,依据顶点处波形的撕裂程度对网格进行不同程度的细分,使得波形变化较大的区域网格更为精细,表现更多更细致的波形细节。
基金项目
课题编号:2018KJT0080-2017GZDZX0002。