繁体   English   中英

OpengGL glDrawElements绘制线条,但不绘制三角形

[英]OpengGL glDrawElements draws lines but not triangles

我有以下代码:

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

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

有任何想法吗?

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

GL_LINES期望成对的流,其中GL_TRIANGLES期望成对的三胞胎。 我不知道您是如何填充m-> indices的 ,但是如果您执行了以下操作:

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手册页

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM