GLSL 效果示例

高度场地形:沿光线查找山脊与谷底

以高度函数生成山体,控制步长以减少穿透和断层。

在线示例

修改右侧代码,左侧预览会实时更新。

观察什么

以高度函数生成山体,控制步长以减少穿透和断层。

实现原理

高度函数定义地面,保守缩小步长以减轻穿透;高度坡度很大时仍需更谨慎的距离界。

找到控制效果的代码

return (p.y+ .4 - .28*fbm(p.xz*1.4) - .07*sin(p.x*2.))/1.8;

动手修改

在 scene 中把地形振幅 .28*fbm(p.xz*1.4) 降为 .14*fbm(p.xz*1.4)。大尺度山丘会变低,独立的 .07*sin(p.x*2.) 山脊仍保留原振幅。

调试与成本

每一步射线都计算四层 fbm,命中后 normalAt 还要再查询六次 scene。把 scene 的除数 1.8 提高到 2.4 可缩短步长;它可能减少越过表面的情况,但也更容易耗尽 80 步上限。

用到的内置函数

一步步学会这个效果