大规模海洋模拟常用的投影网格大多为均匀网格,在实际渲染时,起伏变化较大的区域需要更多的网格来绘制才能达到较好效果,而均匀网格无法达到这一要求。为了改进这一缺陷,在改进的投影网格基础上引入曲面细分技术,依据顶点处波形的撕裂程度对网格进行细分,使得波形变化较大的区域网格更精细,细节表现更丰富。 Most of the projection meshes used in large-scale ocean simulation are uniform meshes. In the actual rendering, more meshes are needed for the areas with large fluctuation to achieve better results, while uniform meshes cannot meet this requirement. In order to improve this defect, the surface subdivision technology is introduced on the basis of the improved projection mesh, and the mesh is subdivided according to the degree of wave tearing at the vertex, so that the area mesh with large wave changes is more refined and the details are more abundant.
林子豪,吴志红,戈文一,谭诗翰
四川大学视觉合成图形图像技术国防重点学科实验室,四川 成都
收稿日期:2019年11月26日;录用日期:2019年12月10日;发布日期:2019年12月17日
大规模海洋模拟常用的投影网格大多为均匀网格,在实际渲染时,起伏变化较大的区域需要更多的网格来绘制才能达到较好效果,而均匀网格无法达到这一要求。为了改进这一缺陷,在改进的投影网格基础上引入曲面细分技术,依据顶点处波形的撕裂程度对网格进行细分,使得波形变化较大的区域网格更精细,细节表现更丰富。
关键词 :大规模海洋,实时绘制,投影网格算法,曲面细分
Copyright © 2019 by author(s) and Hans Publishers Inc.
This work is licensed under the Creative Commons Attribution International License (CC BY).
http://creativecommons.org/licenses/by/4.0/
大规模的自然场景绘制和渲染在游戏、影视、军事仿真等领域使用颇为广泛,而大规模海洋的模拟更是其中最为复杂和困难的分支之一,与地形不同,海洋的表面形态是动态变化的,细节也更为丰富。这对图形学研究提出了更高的要求。
目前水体模拟方法主要分为基于物理的方法和基于构造的方法,基于物理的方法以Navie-Stokes方程 [
对于大面积的网格实时绘制,多层次细节网格模型(LOD) [
随着DirectX11以上版本对曲面细分的支持,该技术被广泛应用到模型网格的渲染开发中。在投影网格的基础上使用曲面细分着色器对原始网格进行进一步细分,增加网格的精细度以及顶点的数量,可以带来更好的效果。王艳芳等人提出基于屏幕空间的网格自适应精化方法 [
如图1所示,首先将屏幕空间划分生成均匀采样网格,其最大分辨率由显卡的渲染性能决定。可编程渲染管线的顶点着色器将从视点发出的投射光线穿过视口的采样网格,与一个基底平面相交,交点即为网格顶点的世界坐标。然后将顶点移动到交点位置,生成原始网格。
图1. 投影网格原理
通过相机的视矩阵和投影矩阵可以把一个点从世界空间转换到投影空间。
p w o r l d = p p r o j ∗ M p r o j − 1 ∗ M v i e w − 1 (1)
其中 p w o r l d 是世界坐标, p p r o j 是投影空间坐标, M p r o j − 1 是投影矩阵的逆矩阵, M v i e w − 1 是视图矩阵的逆矩阵。
因为采样网格基于屏幕空间进行划分的,所以采样网格的大小和数目固定不变。固定的采样网格可以存储在显存中,直接作为顶点处理器的输入数据。由于只在开始传输生成的采样网格,而不是在每一帧中都传输一次网格,因而有效地减少了处理器和显卡之间的传输开销。顶点缓冲区直接把数据加载到显卡的显存里,降低了渲染的时间。另外,由于在每一帧中只对固定数目的三角网格进行投射计算以及渲染,因而在整个渲染过程中帧率较为稳定。
该方法计算速度较快,适用于大规模海面和地形的绘制,但是也存在缺陷,在对投影网格进行坐标置换后,再转换回投影空间可能无法覆盖整个屏幕,原屏幕上下边缘的顶点在上下移动后会在原来的位置产生空隙。此外当摄像机的朝向和水平面平行或者夹角大于90度的时候,此时交点在相机背后而不是在它的前面,无法求出正确的交点。在海面的模拟中,由于投影网格模型的特性,网格无论在平缓还是起伏较大的区域都是均匀一致的,不能够针对起伏处需要更多细节表现的地方增加网格的精细度。
针对特殊情况无法求出正确交点以及产生空隙的问题,目前主要的解决方法是增加一个垂直于海面的辅助相机,强制放大投影网格作用区域来弥补空白区域,但其会降低网格原有的层次细节,影响海面绘制的精细度。
图2是Johanson提出的一种改进方法 [
图2. 改进后的投影网格
通过公式(2)可以求得projector的投影矩阵。
p p r o j = p w o r l d ∗ M v i e w ∗ M p r o j (2)
p w o r l d 是得到的坐标; M v i e w 是Projector的View Matrix; M p r o j 是Camera的Project Matrix得到最大的 M a x p r o j 和最小的 M i n p r o j ,如果是以水平面base计算交点的话, M a x p r o j 和 M i n p r o j 都会是在[−1, 1]的范围,但是以down和up计算的交点的话,那么 M a x p r o j 和 M i n p r o j 的值域会稍稍超出[−1, 1]。需要做一个修正,将Camera投影空间的Grid坐标变换到 [ M i n p r o j , M a x p r o j ] 这个范围内。
r p r o j ⋅ x − M i n p r o j ⋅ x M a x p r o j ⋅ x − M i n p r o j ⋅ x = p p r o j ⋅ x − ( − 1 ) 1 − ( − 1 ) (3)
[ r p r o j ⋅ x r p r o j ⋅ y 0 1 ] = [ p p r o j ⋅ x p p r o j ⋅ y 0 1 ] ∗ M r a n g e (4)
M p p r o j = M r a n g e ∗ M p r o j (5)
M p r o j 是Camera的投影矩阵这样副相机projector的视椎体完全覆盖主像机所能看见的网格的原始区域。
Johanson的改进投影网格方法有效的解决了原始投影网格方法的主要缺陷,但是其将视口的均匀采样网格的水平投影映射到了较大的区域,产生了拉伸,使得变换后的网格是非均匀的,且网格变大,精细度降低。我在该方法基础上进行了调整,在通过主相机计算确定副相机的视椎体后,以副相机作为网格投射相机,计算顶点在水平的投影坐标,生成投影网格。
海浪统计学模型依据对海浪实际观测的统计学结果,将海浪高度场分解为一系列具有不同振幅、频率、相位和方向的正弦波或余弦波。我采用的是Philips谱函数:
H ( x , t ) = Σ h ( k , t ) exp ( i k ⋅ x ) 。 (6)
利用2D快速傅里叶逆变换(IFFT)的快速算法,就可以计算出任意时间的随机波幅高度。的大小决定了海浪移动的快慢,在进行海浪的模拟时,视觉上看到的是海浪的起伏变化快慢,而风速的大小,可以控制海浪的振幅,风向决定了海浪移动的方向 [
j ( p , t ) = | 1 + ∑ i λ i ∂ u i ( p , t ) ∂ x ∑ i λ i ∂ u i ( p , t ) ∂ y ∑ i λ i ∂ u i ( p , t ) ∂ y 1 + ∑ i λ i ∂ v i ( p , t ) ∂ y | (7)
为每个顶点计算jacobi值并存入a通道,最后将置换纹理传给曲面细分着色器使用。
Tessellation (曲面细分)是一种将多边形网格拆解成更细小的网格来提升几何形状逼真度的方法,在顶点与顶点之间自动嵌入新的顶点,并在网格内部重新划分网格单元。曲面细分通过图形处理器自动创造出数百倍与原始模型的顶点,这些顶点的效果等同于CPU传入的顶点,坐标可以被修改。在细分出更多细小网格之后,模型的曲面会变得非常平滑细腻,从而获得更好画面效果的技术。
在大规模海洋模拟中只使用投影网格的话,俯视观察整个网格,平缓和起伏大的不同区域网格也是基本一致的,如果为了更细致的绘制起伏变化大的区域而增加整个网格的精度,那么用数量较多的网格绘制平缓区域显然是没有必要的且会显著增加开销。为了解决这个问题,在投影网格的基础上使用曲面细分着色器,首先使用较粗糙的投影网格作为渲染管线的绘制输入,在顶点着色器中将网格投影到水平面上,世界坐标的xz坐标作为uv纹理坐标。然后在曲面细分着色器中从置换纹理中用uv坐标读取颜色,透明度通道的值即Jacobi值。该值的范围在0到1之间,值越小表示撕裂程度越大,所以将该值的倒数乘以设定的倍率t作为细分系数p:
p = 1 j ∗ t (8)
只对三个顶点的中心点的细分系数超过设定阈值k的三角网格进行细分,细分系数越大细分程度越高。最后使用置换纹理采样得到的rgb的值修改顶点的坐标,对细分后的网格进行坐标置换生成起伏的波浪。
本文实验的实验设备为笔记本电脑,处理器为Intel Core i7-7700HQ,显卡为NVIDIA GeForce GTX1050。编程环境为Visual Studio 2019,渲染环境为Unity 2019。
图3. 网格效果图
设置采样网格大小128*128,使用改进的投影网格方法生成原始网格,为曲面细分着色器的细分倍率设置不同的输入参数,并记录平均帧率。实际表现如图3所示,图3(a)为未使用曲面细分的网格,图3(b)为使用了曲面细分,细分倍率设置为5的网格,可以看到使用了曲面细分的网格方案有针对性的增加了起伏变化较大区域的网格密集度,提高了波浪的细节丰富度。而平缓的区域和未使用曲面细分的模型网格数量基本一致。
表1为不同细分倍率下在一分钟内测得的每秒平均帧率,细分倍率为1时不对网格进行细分即为进行改进的原始海洋网格,以细分倍率5为例,帧率降低了2.3%,顶点数量增加了30%,以很少的性能损耗提升了较多的精细度。在细分倍率低于10的情况下,帧率降低不明显,且效果较为合适,过高的细分倍率产生的极为细密的网格几乎无法观察到,对效果提升很小,且帧率下降严重。
细分倍率 | 平均帧率 |
---|---|
1 | 102.94 |
5 | 100.57 |
10 | 97.39 |
20 | 85.97 |
30 | 71.89 |
表1. 不同细分倍率的帧率
以上对大规模海洋的网格生成方法进行了研究,利用Compute Shader,使用IFFT算法解算Philips频谱生成海洋波形的置换纹理,在改进的投影网格基础上引入曲面细分技术,依据顶点处波形的撕裂程度对网格进行不同程度的细分,使得波形变化较大的区域网格更为精细,表现更多更细致的波形细节。
课题编号:2018KJT0080-2017GZDZX0002。
林子豪,吴志红,戈文一,谭诗翰. 利用曲面细分技术优化的大规模海洋实时绘制方法Large Scale Ocean Real-Time Rendering Method Optimized by Tessellation Technology[J]. 计算机科学与应用, 2019, 09(12): 2323-2329. https://doi.org/10.12677/CSA.2019.912258