OpenGL 高度图地形渲染不绘制

OpenGL heightmap terrain render does not draw

我有一个从 dted 文件创建的位图。我想使用该位图并创建 3d 地形渲染。我试图用顶点向量来做,但我根本无法达到我的目标。这是我的 paintGL 代码:

void render::paintGL(){
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glTranslatef(0,0,-100);
for(int z=0;z<dted.width()-1;z++){
    glBegin(GL_TRIANGLE_STRIP);
    for(int x = 0; x<dted.height()-1; x++){
        glColor3f(matrix[x][z], matrix[x][z], matrix[x][z]);
        glVertex3f(x, matrix[x][z], -z);
        //vertex0 ends here

        glColor3f(matrix[x+1][z], matrix[x+1][z], matrix[x+1][z]);
        glVertex3f(x+1, matrix[x+1][z], -z);
        //vertex1 ends here

        glColor3f(matrix[x][z+1], matrix[x][z+1], matrix[x][z+1]);
        glVertex3f(x, matrix[x][z+1], -z-1);
        //vertex2 ends here

        glColor3f(matrix[x+1][z+1], matrix[x+1][z+1], matrix[x+1][z+1]);
        glVertex3f(x+1, matrix[x+1][z+1], -z-1);
        //vertex3 ends here


    }
    glEnd();
}}

由于网络问题,我不得不编写代码而不是复制粘贴。所以可能有些事情我忘记了,但我已经尽力了。让我解释一下上面的变量和其他内容:

dted 是我创建的 dted 图像,我根据该图像的宽度和高度值设置边界。 matrix 是一个二维矩阵,它包含我从预先创建的 dted 图像像素中获得的高程值。

在上面的所有代码之后我无法渲染地形。我不知道它是否渲染了地形,但它只是不显示我或者根本不渲染。如果您能解释我的错误在哪里并提出解决方案,那就太好了。

如果我犯了任何语法错误,我深表歉意,我希望我能很好地解释我的问题。如果我提供的代码不够充分,请随时提出,我也可以写下其他部分。

祝你有愉快的一天。

编辑:好的,我在这里得到了一个新消息。在对鼠标问题进行了一些控制后,我设法绘制了一个平原。但是,当我尝试获取振幅时,它什么也没显示。我猜那是因为振幅太大了,但是当我将它除以 15 之类的常数时,同样的平原再次出现。这是因为我使用了 GL_TRIANGLE_STRIP 吗?

您的呈现代码看起来很奇怪:您使用退化的三角形构建了三条带,并且可能会访问不存在的数据。我猜到了你的其余方法并试图修复你的方法。试试这个:

void render::paintGL(){
  glLoadIdentity();
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_MODELVIEW);
  glTranslatef(0,0,-100);
  for(int z = 0; z < dted.width() - 2; z++) {
    glBegin(GL_TRIANGLE_STRIP);
    for(int x = 0; x < dted.height() - 1; x++){
        glColor3f(matrix[x][z], matrix[x][z], matrix[x][z]);
        glVertex3f(x, matrix[x][z], -z);
        //vertex0 ends here

        glColor3f(matrix[x][z + 1], matrix[x][z + 1], matrix[x][z + 1]);
        glVertex3f(x, matrix[x][z + 1], -z - 1);
        //vertex1 ends here

    }
    glEnd();
}}

除此之外,三角带都可以。如果您仍然没有看到任何东西,请按照 Sga 的建议使用 GL_POINTS。然后修复 camera/other 渲染代码,直到你看到它们。

对于正在寻找解决方案的其他人:确保您的 glFrustum 的 zNear 参数足够远,可以看到东西。我的要关闭,当我增加它时,问题就解决了。