一直在我自研的名为“星云引擎”的空间引擎上,有个烦人的视觉bug困扰了我很久,始终无法彻底定位。
大致情况是:星球某些区域的地表会出现类似黑胡椒纹理的异常噪点/斑点。这种现象并非全域出现,且会随我在星球上的位置、距离远近,甚至观察角度而变化。当我移动时,摄像机晃动得厉害,导致树木、草地、岩石看起来都像未完全渲染。
最诡异的是,这个问题从我开始制作引擎时几乎就存在,所以并非近期添加功能所致。
我的引擎是基于C++/DirectX 12自研的。星球完全程序化生成,可以从太空无缝飞抵地表,无需加载不同关卡。
星球生成逻辑大致如下:
程序化星球种子 → 大陆/海洋 → 地形高度 → 生物群落 → 材质 → 水体/草地/树木/岩石/天气 → 地形LOD/流式加载。
地表采用立方球行星架构,随着距离拉近,地形区块会逐步增加细节。
从远处看时使用低细节/轨道版本,飞近时再过渡为真实地形。
引擎同样包含大气层、云层、水体、程序化天气、阴影、植被等常规功能。
问题在于这些微小黑色斑点/颗粒总在不同位置出现,我无法确定是哪个系统引发的。
我曾怀疑过以下原因:
* 阴影渗色
* 超远距离可见的草地/植被
* LOD抖动过渡
* 地形纹理/材质混合
* 程序化噪声混叠
* 异常法线
* Mipmapping
* Z轴冲突
* 浮点精度
* 立方球接缝
* 某些着色器返回错误值/NaN
让我觉得问题可能更深层的一个原因是:这些噪点在我对渲染器进行大量修改后依然存在。
这不是一个坏掉的纹理导致全局出问题——你绕着飞会发现,某区域正常,另一区域胡椒效果却非常严重。
由于游戏采用星球级尺度,我也怀疑是否是精度问题。虽然使用相对摄像机渲染,但仍有大量涉及星球中心、摄像机位置、地形位置等的计算。
另一个猜测是程序化细节本身:地形材质大量使用噪声生成,或许在特定距离下,某些高频噪声混叠成了单个暗像素。
但在陷入死循环之前,有没有人见过类似现象?趁我还没把游戏改崩之前求个救😂
构建引擎过程中我仍有很多要学,任何建议都感激不尽。
评论 (0)