在 opengl 中移动透视时,地形模型闪烁

Terrain model flickers when moving the perspective in opengl

提问人:tawan 提问时间:11/10/2023 最后编辑:genpfaulttawan 更新时间:11/10/2023 访问量:48

问:

我正在使用二维数组来生成用于渲染的高度图。

我随机生成了一个 5000 * 5000 的顶点列表:

int ROW = 5000;
int COL = 5000;

struct LineVertex
{
    float x;
    float y;
    float z;
};

float min = -35.0, max = 35.0;
for (int r = 0; r < ROW; r++)
{
    for(int c = 0; c < COL; c++)
    {
        LineVertex lv;
        lv.x  = c;      //x
        lv.y  = min+qrand()/(double)(RAND_MAX/(max-min));
        lv.z  = -r;
        line.append(lv);
    }
}

然后,使用以下代码生成网格:

for(int r = 0; r < ROW - 1; r++)
{
    for(int c = 0; c< COL - 1; c++)
    {
        int topLeft = r * _d->length + c;
        int topRight = topLeft + 1;
        int bottomLeft = (r + 1) * _d->length + c;
        int bottomRight = bottomLeft + 1;

        ebo_data.push_back(topLeft);
        ebo_data.push_back(topRight);
        ebo_data.push_back(bottomLeft);
        ebo_data.push_back(topRight);
        ebo_data.push_back(bottomRight);
        ebo_data.push_back(bottomLeft);
    }
}

我希望使用不同的 y 值和顶点着色器代码显示不同的颜色:

#version 330 core
layout (location = 0) in vec3 aPos;
uniform mat4 model;
uniform mat4 vp_matrix;
out vec4 cus_color;

void main()
{
    gl_Position = vp_matrix * model * vec4(aPos, 1.0);
    cus_color = vec4((aPos.y - -35.0)/70.0);  //In the real code, I actually use a gradient color texture
}

vp_matrix矩阵使用的相机类是通过参考以下命令生成的: https://learnopengl.com/code_viewer_gh.php?code=includes/learnopengl/camera.h

在渲染模型矩阵时,我对 x、y 和 z 进行了归一化。

model.scale(1.0/ROW, 0.3f/70.0f, 1.0f/COL); //I want to limit the display range of x, y, z to 1*1*1

glfunc->glDrawElements(GL_TRIANGLES, ebo_data.count(), GL_UNSIGNED_INT, 0);

渲染结果

当相机面向模型时,模型的一部分会出现类似凹陷的现象。 将相机移动到模型的一侧时,模型看起来正常。

  1. 当我生成的数据为 100 * 100 时,它正常工作。但我希望生成 5000 * 5000 个数据。
  2. 当模型矩阵未缩放时,它看起来很正常,但是当我移动相机距离以显示整个模型时,模型也会闪烁。

我该怎么办?

C++ OpenGL

评论

0赞 Jesper Juhl 11/10/2023
qrand()? ?显式投射到那里并在那里划分..这是怎麽?C?使用现代C++,我们有更好的方法 - 检查 <random> 标头,并查看 rand() 被认为有害RAND_MAXdouble

答: 暂无答案