OpengL glDrawElements绘制线条但不绘制三角形

时间:2011-12-10 12:00:47

标签: c++ opengl

我有以下代码:

for(auto m:shapes) {
    glVertexPointer(3, GL_DOUBLE, 0, m->verts);

    glNormalPointer(GL_DOUBLE, 0, m->normals);

    glDrawElements(GL_TRIANGLES, m->num_triangles*3, GL_UNSIGNED_INT, m->indices);
}

(在图片中,圆圈和点无关紧要,它们是由其他一些代码绘制的。抱歉,我无法发布图片,我是新用户......)

http://dl.dropbox.com/u/5269/Screen%20shot%202011-12-10%20at%2012.38.28%20PM.png

似乎它没有画任何东西。

如果我将GL_TRIANGLES更改为GL_LINES:

for(auto m:shapes) {
    glVertexPointer(3, GL_DOUBLE, 0, m->verts);

    glNormalPointer(GL_DOUBLE, 0, m->normals);

    glDrawElements(GL_TRIANGLES, m->num_triangles*3, GL_UNSIGNED_INT, m->indices);
}

http://dl.dropbox.com/u/5269/Screen%20shot%202011-12-10%20at%2012.44.56%20PM.png

所以似乎坐标在vertext缓冲区中有效,索引缓冲区也可以。 glGetError返回0.最奇怪的是,相同的代码适用于由同一源生成的其他顶点缓冲区。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

尝试在for循环之前将多边形模式设置为GL_LINE(glPolygonMode)。如果您看到线条,则可能是您的投影矩阵用于2D绘图。另外,您在第二张图片中显示的线条是否正确?对我来说是随机的。

答案 1 :(得分:0)

对于这两个示例,您是否使用了相同的 m->索引(顺便说一下,这与Brett Hale指出的相同,因为您可能没有更改枚举常量第二个例子)?

GL_LINES 期望成对的流,其中 GL_TRIANGLES 期望三元组流。我不知道你是如何填写 m->指数的,但如果你做了这样的事情:

0 1 1 2 2 3 3 4 4 5 5 6 ...

您可能会遇到同样的问题。当您将流解释为由对组成时,您将获得您可能看到的所有段:

01   12   23   34   45   56 ...

但是当你将它们解释为三元组时,你会得到三角形,使得两个顶点重合,因此它们是退化的,因此不会被绘制。

011   223   344   556 ...

对于这两个调用,您也不太可能成功使用相同的表达式 m-> num_triangles * 3 。也许这是帖子中的另一个问题,你确实在代码中更改了它。看看glBegin Man Page