Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 从GLSL着色器中的高度贴图生成法线贴图_Opengl_Glsl_Fft_Heightmap - Fatal编程技术网

Opengl 从GLSL着色器中的高度贴图生成法线贴图

Opengl 从GLSL着色器中的高度贴图生成法线贴图,opengl,glsl,fft,heightmap,Opengl,Glsl,Fft,Heightmap,我目前正在使用OpenGL开发一个海洋渲染系统。高度图是用fft计算的,看起来不错。但是,通过从heightmap生成法线贴图,我遇到了一些问题。法线贴图是在片段着色器中使用预计算的高度贴图作为纹理创建的。要计算法线,我使用sobel过滤器,以下是我的代码: // z0 -- z1 -- z2 // | | | // z3 -- h -- z4 // | | | // z5 -- z6 -- z7 // Sobel Filter normal.z =

我目前正在使用OpenGL开发一个海洋渲染系统。高度图是用fft计算的,看起来不错。但是,通过从heightmap生成法线贴图,我遇到了一些问题。法线贴图是在片段着色器中使用预计算的高度贴图作为纹理创建的。要计算法线,我使用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是来自heightmap纹理的HeightValue。 法线的计算是正确的,但在法线纹理中会出现类似于岛屿的台阶/接缝,这会破坏法线贴图的平滑度。高度贴图看起来非常平滑,没有接缝/边缘


我认为存在一些数值错误,分别是高度值的边界,但我不知道如何修复它。

我怀疑有两种可能性:1。法线贴图应该是heightmap的顶点,Sobel算子只是这一点的近似值;在您的情况下,它可能不是一个足够好的近似值,或者2。您正在处理RGB8纹理,因此在高度贴图中只有255个离散的高度级别,这对于您的使用可能不够精确。不过,您可能希望发布更多信息,并可能显示高度贴图、法线贴图和最终结果的图片。