地形渲染
高程图
用Heighfield渲染地形
是通过建立网格,然后根据地形了,来对每个网格中的顶点进行位移和材质的渲染,在开放世界中这个方法就不合适了,计算量太大。在开放世界中通过对远处的地形等模型进行模糊化操作来减少工作。如下,在越远处三角形的密度越稀。fov越窄越三角形密度密集(类似于射击游戏中八倍镜的原理)
优化视图相关错误界的两条黄金规则:
1、离相机越近越密集,fov越小越密集;2、要保证在简化合并的时候,采样点变少,地形高低误差不能超过一个阈值(Error Bound,这个阈值是在视空间上,理性情况下不要超过一个像素)。
Subdivision and T-Junctions
在我们的网格中连接对角线成为两个等腰直角三角形,如果密度不够就在三角形最长边做等分(如上图)。当然这样也有一个叫做 T-Junction 的问题,就是当同一条边相邻的三角形精度不同的时候,高精度的在这条边上的顶点是有起伏的,会产生露边的现象。那么解决方法就是,将低精度的三角形的精度提高到与高精度相同,使模型相连。
现在常用处理地形的方法
四叉树的剖分方式(QuadTree-Based Subdivision)。
对于四叉树的剖分所带来的 T-Junction 的问题也有了更简单的处理方式,即将高密度的部分多出的点吸附到顶点上,产生面积为0的退化三角形。
另外不常用的方法
Triangulated Irregular Network (TIN) 不规则三角网(TIN)
比上面的方法要简化了很多,但一般不会用。
Mesh Shader
是一种新型的 GPU 编程模型,它是为了解决传统的图形管线在处理复杂几何体时的瓶颈而设计的。Mesh Shader 提供了一种更灵活、更高效的方式来处理大量的几何体,特别是在现代的实时 3D 渲染环境中。
在传统的图形管线中,顶点着色器和几何着色器是按顶点或图元(如三角形)顺序执行的,这种方式在处理大量几何体时可能会导致 GPU 的计算能力没有被充分利用。而 Mesh Shader 则采用了一种基于任务的并行处理模型,它可以将一个大的几何体(如一个模型或场景)分解成许多小的任务(称为“meshlets”),每个任务包含一小部分的顶点和图元,然后这些任务可以在 GPU 上并行处理。这种方式可以更好地利用 GPU 的并行计算能力,从而提高渲染效率。
此外,Mesh Shader 还引入了一个新的编程概念——meshlet。一个 meshlet 是一个包含一组顶点和图元的小型几何体,它是 Mesh Shader 处理的基本单位。通过将一个大的几何体分解成多个 meshlet,Mesh Shader 可以在 GPU 上并行处理这些 meshlet,从而实现高效的几何体处理。
Mesh Shader 是由 NVIDIA 首先在其 Turing 架构的 GPU 中引入的,现在已经被 DirectX 12 和 Vulkan 这两个主流的图形 API 所支持。
Real-Time Deformable Terrain
实时变形地形是类似于堆弹簧在地面上,当压他的时候就会变形。
现在很多地形都是不可改变的原因是,改变地形需要改变其模型以及碰撞器等,会造成计算量过于庞大。
当2种材质发生过度的方法:
当一个材质的height高,权重就下降的慢一点,height低就快点退掉。
绘制两边,第一遍把需要用的的贴图的tile以及自身的UV等等信息输出到rendertarget上,CPU根据RT的数据将资源送到GPU,第二遍绘制才是真正的渲染
Virtual Texture 虚拟纹理
把需要的东西装载在内存中,不需要的放在硬盘中。
绘制两遍,第一遍把需要用的的贴图的tile以及自身的UV等等信息输出到rendertarget上,CPU根据RT的数据将资源送到GPU,第二遍绘制才是真正的渲染
基本思路是:将纹理的Mipmap chain分割为相同大小的Tile或Page,这里的纹理是虚纹理,然后通过某种映射,映射到一张内存中存在的纹理,这里的纹理是物理纹理,在游戏视野发生变化的时候,一部分物理纹理会被替换出去,一部分物理纹理会被加载。
绘制地形的问题
浮点数的精度溢出,摄影机与球的位置没有发生改变
解决方法:相机相对于渲染
把相机的位置当作 0,其他的位置相对于相机 小数点相对用到的精度就小了
例如:球在(2000.1,1,0)摄像机在(1990,1,0)把摄像机坐标定为(0,0,0)那么球的坐标就变成立(10.1,0,0)
天空
拟合天空的公式
参与介质
光和参与介质的各种相互作用:
光被吸收
光打中粒子后粒子向四周散射能量
排放
各个光打到粒子上
散射类型
瑞利散射(Rayleigh scattering)和米氏散射(Mie scattering)
瑞利散射是指当光照到直径比光波长小很多的粒子( 大气中的氧分子和氮分子 )时,光会向四面八方散射,而且光的波长越短,散射强度越大(散射强度会和波长的四次方成反比);而米氏散射是指光照到直径跟光波长相当,或是比光波长还要大的粒子(烟雾,液滴,尘埃)时,光主要会沿着原本行进的方向散射。但与瑞利散射不同,米氏散射的散射强度和波长并没有固定关系。 空气中的微粒会造成米氏散射,而且当微粒大小与波长相近时,会有共振增强散射的现象。
瑞利散射:h为海拔高度,入是光的波长,Phase Function为拟合形状方程。
米氏散射:Phase Function为拟合形状方程。
单次散射和多次散射
效果对比:
核心思想就是沿着一条射线一直积分下去。
射线行进是一种常用的沿路径积分函数的方法。
用射线行军法计算了给定点单次散射的最终辐射。
集成亮度通常存储在查找表(LUT)中。
Precomputed Atmospheric Scattering
这个算法的核心思想是:通过 Ray Marching 的算法把大气上的散射现象以及通透度等现象计算出来做成一个表格,在使用的时候在查询即可。
方法优化:通过把各个方向的散射当做是均匀的,所以光的散射现象变成了一个百分比的衰减现象。通过计算一次二次的散射就可以算出一个百分比。由于是均匀的所以就变成了一个级数的计算。
云
Volumetric Cloud Modeling
一部分是云的分布,一部分是云的厚度
但是这个方法产生的云类似于柱体,所以引入了Noise,比如Perlin Noise(棉絮状噪声)和Worley Noise(细胞结构状)等,先利用低频把云的规则边缘模糊化,再加上一些高频来优化细节。