我正在编写地形渲染器,它解释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存储库中找到: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()));
答案 0 :(得分:1)
显然你的数据是紧密打包的,而OpenGL期望默认情况下它是4字节对齐的。在glTexImage2D
调用之前,您可以使用以下内容覆盖预期的对齐:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);