我目前正在使用 OpenGL 开发海洋渲染系统。高度图是用 fft 计算的,看起来不错。但是我从高度图生成法线贴图有一些问题。法线贴图是通过使用预先计算的高度图作为纹理在片段着色器中创建的。为了计算一个正常值,我使用了 sobel 过滤器,这是我的代码:
// z0 -- z1 -- z2
// | | |
// z3 -- h -- z4
// | | |
// z5 -- z6 -- z7
// Sobel Filter
normal.z = 1/normalStrength;
normal.x = z2 + 2*z4 + z7 - z0 - 2*z3 - z5;
normal.y = z5 + 2*z6 + z7 -z0 - 2*z1 - z2;
z0 - z7 是来自高度贴图纹理的高度值。法线计算正确,但在法线纹理中出现了岛状台阶/接缝,这破坏了法线贴图的平滑度。高度图看起来非常平滑,没有接缝/边缘。
我认为有一些数字错误分别与高度值的边界,但我不知道如何解决它。