OpenGL高度图地形渲染不绘制

Posted

技术标签:

【中文标题】OpenGL高度图地形渲染不绘制【英文标题】:OpenGL heightmap terrain render does not draw 【发布时间】:2015-06-12 07:24:59 【问题描述】:

我有一个从 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 图像,我设置了图像宽度和高度值的边界。矩阵是一个二维矩阵,它保存了我从预先创建的 dted 图像像素中获得的高程值。

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

如果我犯了语法错误,我很抱歉,我希望我能很好地解释我的问题。如果我提供的代码不够用,请随意提及,其他部分我也可以写下来。

祝你有美好的一天。

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

【问题讨论】:

首先,确保您能够绘图:从硬编码位置的一个三角形开始。第二:matrix 值在 0 和 1 之间?如果您将它们输入到glColor3f,它们应该是。你能检查一下吗? 我检查了它,发现它不是。但是,我将它划分为 255(像素值从 0 到 255),它仍然没有显示任何内容。顺便说一句,我已经画了一个立方体,它显示得很好。 现在你必须检查你的相机:是不是太远了?平面是否垂直于它(这样就变成了一条细线)?尝试用乘数夸大 Y 值 我为此设置了一个鼠标事件,右键单击时缩小,左键单击时放大,这会改变 translatef 函数的 z 值。我确实将 Y 的幅度乘以 15 (matrix[x][z]*15),不出所料,我看不到它。你认为问题出在相机上吗? 是的,它可以指向其他地方 【参考方案1】:

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

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。然后修复你的相机/其他渲染代码,直到你看到它们。

【讨论】:

我已经设法渲染了一些东西,但它似乎太大而无法看到,无论我缩小多远,它似乎都不是一个可以理解的渲染对象。对于有角度的视图,我添加了以下代码:'glRotatef(45,0,1,0)' 三角条有必要吗?我可以使用多边形或四边形吗?这更适合我的目的,因为我想逐块渲染它,就像逐像素渲染 2d 图像一样。 我发布的渲染代码相当简约,应该可以工作。如果几何是“极端的”,请检查您通过矩阵类获得的值。作为测试,您可以(再次)用零或任何其他常量替换所有“matrix[][]”。如果它仍然不起作用,请检查您用作模型视图和投影的矩阵。我觉得很奇怪,在调用 glMatrixMode 之前调用 glLoadIdentity()。 ... 顺便说一下,TRIANGLE_STRIP 是您想要使用的。 QUAD 或 POLYGON 在现代图形中不受欢迎,最好避免这些。为了您的理解,与像素等效的不是四边形(或三角形),而是顶点。三角形指定连接,例如插值的结构。 感谢大家的帮助。我终于能够做到了。没有你们的帮助,我做不到。非常感谢...【参考方案2】:

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

【讨论】:

以上是关于OpenGL高度图地形渲染不绘制的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL读取灰度图生成地形

OpenGL读取灰度图生成地形

Opengl屏幕到地图坐标转换

OpenGL:纹理坐标实时变化的地形的最佳渲染方法?

OpenGL纹理组合不(总是)工作

opengl如何绘制一个三维平面