跳转到主要内容
Computer Graphics Jun 21, 2022 2 tags

06.游戏中地形大气和云的渲染(上)

06.游戏中地形大气和云的渲染(上)

cover

绘制地形

地形的几何

高度场地形

最简单的想法:高度图 等高线图

但是在几公里甚至几十公里的开放世界游戏中,这种数据量是庞大的,我们首先想到的同样是近大远小,光敏感度等LOD原理,但是有个问题:地形和OBject不同的是,地形是连续的。因此地形的LOD需要用心设计。

FOV越来越窄的时候三角面越密:当FOV缩小时,屏幕上的地形会越来越大(举例:4~8倍镜就是把FOV变小)。

一条是FOV和摄像机距离

另一条是和预计算地形的差值(举例:1000米以外地形有差10cm根本注意不到)。

缺点:对地形数据的管理和算法不符合直觉。

优点:结构简单规整;

便于地理空间下的数据管理,比如数据流和对象剔除。

缺点:细分不如三角面灵活;

子节点和面级别要一致。

优点:实时计算简单;

用了更少的面。

缺点:需要预计算;

难以更改。

GPU细分

无高度场地形

从顶点着色器中选择一个点删除,传递一个0信息,计算机会通过四叉树算法自动上移/下移相邻的点,自然在最后渲染时就会把所有包含该点的信息删除,但是缺点是会产生锯齿状模型,设计师可以通过创建一个半圆的隧道放进去遮挡掉。

地形的材质

通过ALPHA创建权重,设计师通过笔刷就能创建一个混合材质。

但是混合极不真实

通过高度图混合材质:把高度信息拿来比较,你的高度高,那么混合权重就高,高度低混合权重就低。

缺点:这种信息切换是01切换(指没有过渡,直接切换),在近处观察没有问题,远景观察过渡会很锐利。

添加了一个0.2的Bias扰动,如果差异小于图中的0.2,那么这部分还是不要01切换,依然是ALPHA混合的。

3DTexture需要做多维度插值,所以计算量很大;Texture Array需要告知准确采样哪一层Index,不会做插值。

昂贵的材质混合:当一个材质被多次采样的时候会降低性能;我们只看到一小块地形,但是要加载100km^2的地图到内存中。

虚拟纹理(Virtual Texture)

建立一个虚拟纹理index来表示混合好的整个地形场景;

加载的数据也根据LOD的原理还传递信息;

需要预烘培好混合的材质Tile放到物理材质(存到显存)中。

优点:显存占用变小;预烘培好的值可以直接速查。

当相机和物体数值较大时(从1m到60000km)浮点错误引起的抖动。

一个浮点占用32bit存储数据其实是非常少的,当要remap到一个极大的物体时,就会发生这种错误,当然我们可以使用double甚至两个double的格式来存储数据,但是只要被remap的物体够大,这种情况就必然会发生。

从世界空间坐标转换为相机坐标,然后把相机坐标设置为0,就能渲染整个银河啦!

植被、道路和贴画等

道路最常见的想法:样条Spline系统;道路一旦拉出来调整就要对高度场进行侵蚀等模拟。

道路和贴花抖一股脑放到虚拟纹理VT中,同样是空间换时间,都提前预计算好在VT中。

Related Articles

继续阅读