【GAMES104】 游戏中的大地渲染

一、地形几何

最开始,也是最简单表达一个地形的方法就是高程图(Heightfield),也就是用明暗颜色代表地形高度的图。虽然简单,但是当高程图与纹理和光影搭配的时候也有很高的表现力。

那么如何处理地形渲染的问题,最简单的方法就是在每隔一段距离做一个网格,根据高程图去移动网格顶点,但问题也很明显,当世界特别大的时候存储就成了问题。

【GAMES104】 游戏中的大地渲染_第1张图片

那么接下来就是老生常谈的网格细分(Mesh Tessellation)的问题了,实际上在渲染地形的时候只需要渲染相机可以观察到的地方。这其中要保持两个原则:1、离相机越近越密集,fov越小越密集;2、要保证在简化合并的时候,采样点变少,地形高低误差不能超过一个阈值(Error Bound,这个阈值是在视空间上,理性情况下不要超过一个像素)。

【GAMES104】 游戏中的大地渲染_第2张图片

将三角形做的疏密相间,最经典的方法就是基于三角形的剖分(Triangle-Based Subdivision) 。在我们的网格中连接对角线成为两个等腰直角三角形,如果密度不够就在三角形最长边做等分(如上图)。当然这样也有一个叫做 T-Junction 的问题,就是当同一条边相邻的三角形精度不同的时候,高精度的在这条边上的顶点是有起伏的,会产生露边的现象。那么解决方法就是,将低精度的三角形的精度提高到与高精度相同,使模型相连。

【GAMES104】 游戏中的大地渲染_第3张图片

 然而,这种基于三角形的剖分(由于本质是个二叉树也叫 Binary Triangle-Based Subdivision)不易于储存管理,同时也不符合人的设计逻辑。如今用的更多的是四叉树的剖分方式(QuadTree-Based Subdivision)。对于四叉树的剖分所带来的 T-Junction 的问题也有了更简单的处理方式,即将高密度的部分多出的点吸附到顶点上,产生面积为0的退化三角形。

【GAMES104】 游戏中的大地渲染_第4张图片

但现代的制作基本是靠GPU去绘制的,如 DX11 的Hull-Shader、Domine-Shader、Geometry-Shader和 DX1 2的 Mesh-Shader。

地形绘制当然还有其他的部分:如动态的地形绘制,比如车轮压过,接触的地形会下降,周围的部分会上升;绘制洞穴,经典的方法是在地形上搭放一个额外的东西,还有一种更好的方法就是将网格中空洞的部分设为None不去渲染。

二、地形的材质

在设计地形我们需要的材质可谓是上百种,要表现出真实感就需要多种材质的融合。最简单的融合方法是材质上进行加权叠加,但这种方法做出的效果是非常假的(左图)。进一步的改进就是根据Height去调整权重,根据对比的高度显示不同的材质(右图)。

【GAMES104】 游戏中的大地渲染_第5张图片 【GAMES104】 游戏中的大地渲染_第6张图片

 但在实际上,在远处观察纹理的时候,就会发现两个不同材质的分界线是sharp的,这里可以给高度加入一个Bias,当高度差在这个Bias之内可以直接让这两个材质混合使材质融合更平滑。

【GAMES104】 游戏中的大地渲染_第7张图片

 在实际上百种材质混合上现在通常运用一个Texture Array去混合材质,也就是说在给出Array中的每一个的权重,然后再加权输出。早先的游戏确实是这么运作的,但我们发现每访问一个像素点我们都需要查询几十个材质,这样无疑的十分昂贵的。

Vritual Texture运用了mipmap的方法,我们将材质预先混合起来,然后根据不同的层级进行存储(LOD),每个像素只存储当前位置每个层级的所有材质(physical texture),加载的时候根据层级去直接提取出相对应的材质信息。

【GAMES104】 游戏中的大地渲染_第8张图片

 三、其他问题

浮点数存储空间的固定的,如果世界坐标固定,相机跟随物体朝着一个方向不断移动,会发现由于浮点数的精度不断下降会产生剧烈的畸变。当今通常会用相机的相对位置去重新定义他们(Camera-Relativa Rendering),随着物体的移动,将世界坐标重新归到相机坐标上,充分利用浮点数的精度。

【GAMES104】 游戏中的大地渲染_第9张图片

你可能感兴趣的:(games104,游戏,游戏引擎)