c++ - 将 SRTM *.hgt 文件作为纹理传递给 OpenGL 着色器会导致图像倾斜

标签 c++ opengl terrain heightmap

我正在编写解释 NASA SRTM *.hgt 文件以获取高度数据的地形渲染器。我实现了此处描述的 LOD 技术:http://www.pheelicks.com/2014/03/rendering-large-terrains/ .

我的地形网格有 1024 宽度和高度。高度图是 1201 x 1201。我将高度图加载到内存中,并将其作为纹理发送到着色器。然后我使用 x 和 z 分量在 [-512, 512] 范围内的当前顶点位置在顶点着色器中对其进行采样。接下来,我将它除以 1024,得到 x 和 z 在范围 [-0.5, 0.5] 内的 vector 。网格的左上角位于 (-0.5, -0.5),因此我添加 vec2(0.5, 0.5) 以“规范化”它。

当使用计算坐标对 jpeg 文件进行采样时,一切看起来都符合预期,但是当我对高度图进行采样时,它看起来像这样: enter image description here

用这条奇怪的对角线。 在想了一会儿这张图片有什么问题之后,我发现高度图实际上只是倾斜了(或者我的采样以某种方式倾斜了......)并且在左边你可以看到应该在右边的部分,如下所示: enter image description here

我不知道这里发生了什么。考虑到 jpeg 图像使用相同的采样代码完美地放置在网格上,我认为采样方法不会有问题。

所有代码都可以在 github 存储库中找到:https://github.com/0ctothorp/terrain_rendering/tree/lod2在“lod2”分支中。

最有趣的部分可能是示例代码:

sample_ = texture(heightmap, (position.xz / meshSize) + vec2(0.5f, 0.5f)).r;
position.y = sample_ / 50.0f;

以及我如何将高度图传递给着色器:

GL_CHECK(glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, 1201, 1201, 0, GL_RED_INTEGER, GL_SHORT, 
                      hmData->data()));

最佳答案

显然,您的数据是紧密打包的,而 OpenGL 期望它在默认情况下是 4 字节对齐的。您可以在 glTexImage2D 调用之前使用以下内容覆盖预期的对齐方式:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

关于c++ - 将 SRTM *.hgt 文件作为纹理传递给 OpenGL 着色器会导致图像倾斜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43768852/

相关文章:

c++ - OpenGL纹理,没有错误,但灰色

c# - 如何在代码中更改地形纹理

c++ - Visual Studio 2008调试;在写入值时中断

xcode - OpenCv ImShow()函数闪烁

OpenGL VBO 着色器

c++ - GLFW 无法创建 4.3 上下文

c++ - STL priority_queue 参数

python - Py_BuildValue 和 PyArg_ParseTuple Seg 错误

c++ - Qt-用图像填充圆圈

c# - XNA C# 可破坏地形