更改高度图,使其在 4x4 网格上显示 16 个高度图

Changing a heightmap so it show 16 hieghtmaps on a 4x4 grid

更改程序以显示 16 个相同的高度图,这些高度图排列在 4 x 4 的网格中。高度图的边缘应该在 X 和 Z 坐标中并排。但是,它们不会在 Y 方向上接触,因为高度会不同。

C++

下面的代码是我已有的,我只是不太确定如何让它显示 16 个相同的高度图,这些高度图排列在 4x4 网格中。我知道这与高度图上的方块有关,但我很困惑。

 const int HEIGHTMAP_SIZE = 12;
 float heights[HEIGHTMAP_SIZE + 1][HEIGHTMAP_SIZE + 1];  

initDisplay();
    for (unsigned int x = 0; x <= HEIGHTMAP_SIZE; x++)
    {
        for (unsigned int z = 0; z <= HEIGHTMAP_SIZE; z++)
        {
            heights[x][z] = (x % 2) * 0.5f -
            z * z * 0.05f;
        }
    }
    //TextureManager::activate("rainbow.bmp");
    initHeightmapDisplayList();

 void initHeightmapHeights()
 {
    for (unsigned int x0 = 0; x0 < HEIGHTMAP_SIZE; x0++)
    {
        unsigned int x1 = x0 + 1;
        float tex_x0 = (float)(x0) / HEIGHTMAP_SIZE;
        float tex_x1 = (float)(x1) / HEIGHTMAP_SIZE;
        glBegin(GL_TRIANGLE_STRIP);
        for (unsigned int z = 0; z <= HEIGHTMAP_SIZE; z++)
        {
            float tex_z = (float)(z) / HEIGHTMAP_SIZE;
            glTexCoord2d(tex_x1, tex_z);
            glVertex3d(x1, heights[x1][z], z);
            glTexCoord2d(tex_x0, tex_z);
            glVertex3d(x0, heights[x0][z], z);
        }
        glEnd();
    }
 }  

 void initHeightmapDisplayList()
 {
    heightmap_list.begin();
    glEnable(GL_TEXTURE_2D);

    TextureManager::activate("ground.bmp");
    glColor3d(1.0, 1.0, 1.0);
    initHeightmapHeights();
    glDisable(GL_TEXTURE_2D);
    heightmap_list.end();
 }

我怀疑您的 TextureManager 已经有一种无需直接调用 OpenGL 即可执行此操作的方法。 你应该做的是让纹理自己重复。

glTexParamteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

然后将纹理坐标放大 4 倍,您将获得原始纹理的 4x4 网格。