GAMES104 06.游戏中地形大气和云的渲染(上)
06.游戏中地形大气和云的渲染(上)
地形的几何
大自然中很多现象都是分形,用数学语言描述,对计算机更好理解。
Adaptive Mesh Tessellation
在屏幕上,每个像素内看到的三角形密度是一致的。
网格细分算法
Triangle-Based Subdivsion
上一节中,距离近的物体三角形更为密集,所以现在就涉及到了如何细分三角形:
对等腰三角形来说,直角点与斜边中点相连,细化出两个新三角形
Subdivsion and T-Junctions
事实证明,三维渲染引擎只有在封闭多边形网格不包含任何 T 型交点的情况下,才能保证网格的紧密性(无可见缝隙)。 原因在于,一旦开始旋转三维物体,精确坐标就不再精确了
QuadTreee-Based Subdivsion
优点:容易构建、quad符合数据规范
缺点:也有T-Junctions(解决方法:Stitching,多的点吸附到其他点,形成退化三角形(面积为0))
GPU-Based Tessellation
Hardware Tessellation
- Hull Shader:生成Subdivision Patch,Patch由几个控制点组成定义了一个细分面。
- Tessellator Shader:根据Patch生成点集和这些点集的重心坐标。
- Domain Shader:生成三角网格
- Geometry Shader:添加额外的Primitive
Mesh Shader Pipline
相比DX11提供的曲面细分方法,Mesh Shader Pipline
更为简单好理解。
Real-Time Deformable Terrain
有了曲面细分之后,再进一步就可以着手处理与地形的交互了。以雪地交互为例,当物体在雪地中移动时,我们用一张Texture来记录物体运动的轨迹。然后将这张Texture传入地形Shader中,做曲面细分。这样就可以实现雪地的交互变形效果。
Voxelization
体素化,在我理解看来,和点云非常非常相似,每个点包含模型的表面信息和内部属性
Marching Cube
Marching Cube使用许多Cube来对物体进行填充表示。Cube的点与被表示的物体有两种情况:处于物体内部和处于物体外部。一个Cube有8个点,这样每个Cube就有2^8=256种情况。由于反转状态不变,所以可以减少一半,为128种。再根据旋转不变形,又可以减少到14种情况。
地形的材质
Texture Splatting
当我们给地表上色时,会用到地表的纹理,显然的是地表由多种纹理组合而成,他们的交界处存在重叠的情况。使用alpha混合会出现及其不自然、反常识的情况,接下来我们讨论如何进行纹理过渡。
Simple Texture Splatting
一种处理方式是比较两张纹理的高度图,高度高的权重下降慢一些。
不过这种处理方式有一种问题:当摄像机较远或者摄像机与目标夹角较小时,分界线过于高频的信息会导致抖动、不自然。
此时我们加入一些扰动:当两者之间加权高度差在0.2之间时,两者做插值。
tips:
3D Texture
取值时需要位置之上与位置之下的纹理进行三线性插值Texture Array
则是对Array
中相同位置进行取值,后以加权的方式进行混合。
Virtual Texture
要理解 Virtual Texture
先讲讲系统中常用的 Virtual Memory
。
- 地址映射(Address Mapping): 每个程序运行时使用的地址被称为虚拟地址,而硬件实际访问的内存地址被称为物理地址。 虚拟内存通过页表将虚拟地址转换为物理地址。页表记录了虚拟页面到物理页面的映射关系。
- 分页(Paging): 内存被划分为固定大小的块,称为页(Page)。虚拟内存中的每个页面与物理内存中的一个页面相关联。 这样,操作系统可以将不经常使用的页面暂时存储到磁盘中,称为交换(Swapping),并在需要时重新加载到物理内存中。
VT很大程度上用了VM的思想,将纹理的mipmap chain分割为相同大小的tile或page,这里的纹理叫虚纹理,然后通过某种映射,映射到一张内存中存在的纹理,这里的纹理是物理纹理,在游戏视野发生变化的时候,一部分物理纹理会被替换出去,一部分物理纹理会被加载。
Floating-point Precision Error(浮点数溢出)
所有物体的位置都相对于相机进行计算,从而减少坐标值的大小,提升精度。具体实现步骤包括:
- 相机相对坐标的计算:在CPU端,用高精度(double类型)的浮点数计算物体相对于相机的位置,然后将这些相对坐标传给GPU。
- 矩阵变换:将物体的相对坐标通过变换矩阵转换为相机坐标,再进一步转换为投影坐标,从而完成渲染。
- 减少浮点误差:通过相机相对渲染的方法,避免了直接将小坐标与大坐标进行计算,大大减少了浮点数精度丢失的问题。
植被道路贴图花等
Tree Rendering
LOD 是根据 3D 对象与查看器或摄像机的距离来减少多边形数量的方法。
Tree Rendering 就是利用LOD方法
Decorator Rendering
装饰性渲染,比如草
Road and Decals Rendering
Road在地形中的处理较为复杂,因为不仅要处理渲染纹理,还需要处理高度场。
Decals是将物体附着在对象上的技术,例如人脸上的花纹,建筑上的弹孔。
现代通常会用程序化的方式对地形物件进行生成,上面这些所有的纹理在渲染时,都直接Bake到VT中,减少渲染成本。