GAMES104-游戏中地形的渲染

如何把自然渲染出来
真实世界有什么?
天空、村庄、河流、植被。。

如何画地形?(Terrain Rendering)
比较简单的方法:
Heightfield,高层图(?)
Height Map + Contour Map
每隔1m 生成不同高度的 Mesh 其实就是定点位置偏移
缺点:局限于小地图,三角面太多了
可以优化:通过 LOD 远处的细节精度可以变低
注意,地形是连续的,需要特殊处理

通过相机 FOV,在里面的三角形会很细腻,外面的会很稀疏
FOV 里面根据远近、角度再细化
最后需要某个区域内保证三角形的密度是一样的

怎么把三角形变的疏密?
三角形的剖分:(二叉树)
通过正方形格子,变成等腰直角三角形,再通过斜边切成2个等腰直角三角形

T-Junctions 问题:地形裂变,边界问题
继续细分和边界保持一致

一般游戏引擎使用四叉树的解决方案(正方形四分块)
迎合人的直觉
迎合 GPU 贴图格式

Stitching(吸附),解决 T-Junctions问题
切分点吸附到上面或者下面

Triangulater Irregular Network(TIN)
不规则三角形,需要预处理简化
优点就是:面数小


现在都是 GPU 自动完成网格构建了,不需要自己构建了
Mesh Shader Pipeline(DX12 以上)

如果是 GPU 方便做的功能:
1.Real-Time Deformable Terrain 动态地形
原理:
假设地面以下有个弹簧,如果有物质就压下去,没有的话就一点点往上挤

Non-Heightfield Terrain
悬崖挖洞效果:(投机取巧)
需要挖掉顶点的位置设为nil,现代 GPU 就会把用到这个顶点的三角形全部干掉
可以一片一片的删除顶点,但是会有一片一片的棱角
解决方案:插入一个新的模型做遮挡

Volumetric Representation
体素化表达
在三维空间的每个点存在一个权重值,代表空间有没有物质以及密度
Marching Cube 算法
扫描 CT 用的,可以根据点生成出形状
虚拟人

如何给地形上色?(Materials)
地表的材质量非常大

最简单的方法
各种各样的材质,
BaseColor+Normal+Roughness+Height+高度图+混合贴图

混合贴图:根据图片的 a 做混合
边界会模糊处理的,有一层不真实的交叉效果
解决方案:使用高度图,根据高度计算混合下滑程度
缺点:移动时候会抖动

材质太多怎么办?
早期方案
Texture Array:很多层 Texture 叠在一起,每次传一个 index,采样某一层
(不一样的东西 3D Texture:对上下左右前后八个方向进行采样)
视差贴图(Parallax mapping):产生视觉上的凹凸感

问题:
材质混合效率很低
只要能看见地形的每一个像素,都会受到十几种贴图材质影响

优化:
Virtual Texture(虚拟材质)
核心思想:只需要把用到的东西装在内存,其他的装在硬盘
地图分块,正常是 1024x1024 的地块,一层一层压缩,内存固定块,反向查找需要的
Bake(?,暂时不懂)
老数据流向:
磁盘=>CPU=>GPU
中间一层很慢,后续可能硬件会优化

Floating-point Precision Error
浮点数的精度溢出问题
如何存Float,用32个01表示,所以随着精度越来越大,会溢出
异常表现:会抖动
解决方案:
Camera-Relative Rendering(相机相对渲染)
把相机的位置当作 0,其他的位置相对于相机 小数点相对用到的精度就小了


其他东西


原理:
近处看是真实的 Mesh,远处看就是几个简单的插片,最远处的一个广告牌,一次绘制一大批

草、灌木丛、碎石
技术:
Decorator Rendering,装饰物渲染

道路系统
道路之间有穿插
Spline-based 通过拉线的方法,生成道路线
需要生产贴图,对高度图进行处理

贴片(Decals)
比如说 FPS 游戏的子弹孔
道路的贴图,看起来很复杂
一般都会 Bake 到 VT 里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值