
绘制地形
地形的几何
高度场地形
最简单的想法:高度图 等高线图
但是在几公里甚至几十公里的开放世界游戏中,这种数据量是庞大的,我们首先想到的同样是近大远小,光敏感度等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中。