我目前正在使用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是高度图纹理的高度值。 法线正确计算,但在正常纹理中会出现岛状的步骤/接缝,这会破坏法线贴图的平滑度。高度贴图看起来非常光滑,没有接缝/边缘。
我认为高度值分别存在一些数值错误,但我不知道如何修复它。