avatar

Ycyofmine’s Blog

云鸮雨霁

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于
首页 GAMES104 06.游戏中地形大气和云的渲染(上)
文章

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

发表于 2024/10/16
作者 Ycyofmine
9 分钟阅读

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

地形的几何

大自然中很多现象都是分形,用数学语言描述,对计算机更好理解。

Adaptive Mesh Tessellation

在屏幕上,每个像素内看到的三角形密度是一致的。

网格细分算法

Triangle-Based Subdivsion

上一节中,距离近的物体三角形更为密集,所以现在就涉及到了如何细分三角形:

对等腰三角形来说,直角点与斜边中点相连,细化出两个新三角形

Subdivsion and T-Junctions

T 形交点是两个多边形沿着另一个多边形的边缘相交的地方

事实证明,三维渲染引擎只有在封闭多边形网格不包含任何 T 型交点的情况下,才能保证网格的紧密性(无可见缝隙)。 原因在于,一旦开始旋转三维物体,精确坐标就不再精确了

QuadTreee-Based Subdivsion

  • 优点:容易构建、quad符合数据规范

  • 缺点:也有T-Junctions(解决方法:Stitching,多的点吸附到其他点,形成退化三角形(面积为0))

GPU-Based Tessellation

Hardware Tessellation

DX11提供了基于硬件的曲面细分可选Shader DX11的绘制流程

  • 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。

  1. 地址映射(Address Mapping): 每个程序运行时使用的地址被称为虚拟地址,而硬件实际访问的内存地址被称为物理地址。 虚拟内存通过页表将虚拟地址转换为物理地址。页表记录了虚拟页面到物理页面的映射关系。
  2. 分页(Paging): 内存被划分为固定大小的块,称为页(Page)。虚拟内存中的每个页面与物理内存中的一个页面相关联。 这样,操作系统可以将不经常使用的页面暂时存储到磁盘中,称为交换(Swapping),并在需要时重新加载到物理内存中。

VT很大程度上用了VM的思想,将纹理的mipmap chain分割为相同大小的tile或page,这里的纹理叫虚纹理,然后通过某种映射,映射到一张内存中存在的纹理,这里的纹理是物理纹理,在游戏视野发生变化的时候,一部分物理纹理会被替换出去,一部分物理纹理会被加载。

Floating-point Precision Error(浮点数溢出)

所有物体的位置都相对于相机进行计算,从而减少坐标值的大小,提升精度。具体实现步骤包括:

  1. 相机相对坐标的计算:在CPU端,用高精度(double类型)的浮点数计算物体相对于相机的位置,然后将这些相对坐标传给GPU。
  2. 矩阵变换:将物体的相对坐标通过变换矩阵转换为相机坐标,再进一步转换为投影坐标,从而完成渲染。
  3. 减少浮点误差:通过相机相对渲染的方法,避免了直接将小坐标与大坐标进行计算,大大减少了浮点数精度丢失的问题。

植被道路贴图花等

Tree Rendering

LOD 是根据 3D 对象与查看器或摄像机的距离来减少多边形数量的方法。

Tree Rendering 就是利用LOD方法

Decorator Rendering

装饰性渲染,比如草

Road and Decals Rendering

Road在地形中的处理较为复杂,因为不仅要处理渲染纹理,还需要处理高度场。

Decals是将物体附着在对象上的技术,例如人脸上的花纹,建筑上的弹孔。

现代通常会用程序化的方式对地形物件进行生成,上面这些所有的纹理在渲染时,都直接Bake到VT中,减少渲染成本。

GAMES104
games104
本文由作者按照 CC BY 4.0 进行授权
分享

最近更新

  • ROS2中并发连接蓝牙手柄排错过程
  • 自行编译ros2-humble-plotjuggler
  • Ubuntu 22.04上蓝牙无法打开——(MT7922网卡为例)
  • Isaac sim遥操作控制
  • RPC:原理、组成与局限性
外部链接
  • codetime
  •  此博客的 Github 仓库

文章内容

相关文章

2024/11/12

GAMES104 09.高级动画技术:动画树、IK和表情动画

动画混合 Math of Blending: LERP Calculate Blend Weight Align Blend Timeline 把两个循环动画时间归一化,要求动画师对齐两组动画中的关键点。 如果align或者插值没做好,容易出现滑步。 混合空间 1D Blend Space 混合方向,但是没有混合运动速度。 2D Blend S...

2024/11/05

GAMES104 08.游戏引擎的动画技术基础(下)

蒙皮动画的实现:关节与蒙皮 Joint Pose Affine Matrix Orientation 大部分骨骼动画是旋转。 Position Pelvis、特殊的机械结构、facial joints会发生位置的变化。 Scale 对面部进行修改。 Loca...

2024/11/01

GAMES104 08.游戏引擎的动画技术基础(上)

靠,被专周硬控一周,不过好在大概知道C++项目整个流程是什么样的了,也算是有所收获。 2D游戏动画技术 Sprite animation 多张图片顺序播放。 Live 2D 将图片拆分成多个图源,在图源上打上控制点,通过移动控制点来达到图片变换的效果。 3D游戏动画技术 DoF(Degrees of Freedom) 六方向自由度代表可以按 xyz 进行平移或旋转。 Rigid Hi...

GAMES104 05.渲染中光和材质的数学魔法

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

© 2025 Ycyofmine. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

热门标签

games104 UE c++ robot OS 装机 计网 essay

发现新版本的内容。