【发布时间】:2017-05-03 19:53:36
【问题描述】:
我正在编写解释 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] 范围内的向量。网格的左上角位于 (-0.5, -0.5) 所以我添加vec2(0.5, 0.5) 来“标准化”它。
当使用计算出的坐标对 jpeg 文件进行采样时,一切看起来都符合预期,但是当我对高度图进行采样时,它看起来像这样:
用这条奇怪的对角线。 经过一段时间的思考,这张图片出了什么问题,我发现高度图实际上只是歪斜了(或者我的采样有点歪斜......),在左边你可以看到应该在右边的部分,就像这里:
我不知道这里发生了什么。考虑到 jpeg 图像使用相同的采样代码完美地放置在网格上这一事实,我认为采样方法不会有问题。
所有代码都可以在 github 存储库中找到:“lod2”分支中的https://github.com/0ctothorp/terrain_rendering/tree/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()));
【问题讨论】:
标签: c++ opengl terrain heightmap