openGL奇怪的bug?

时间:2011-04-15 11:16:39

标签: c++ opengl

我有以下代码:

glNormal3f(0, 0, 1);
glColor3f(1, 0, 0);
glBegin(GL_POINTS);
    glVertex3f(-45, 75, -5);
    glVertex3f(-45, 90, -5);
    glVertex3f(-30, 90, -5);
    glVertex3f(-30, 80, -5);
    glVertex3f(-35, 80, -5);
    glVertex3f(-35, 75, -5);
    glVertex3f(-45, 75, -5);

glEnd();
glColor3f(1, 1, 0);
glBegin(GL_POLYGON);
    glVertex3f(-45, 75, -5);
    glVertex3f(-45, 90, -5);
    glVertex3f(-30, 90, -5);
    glVertex3f(-30, 80, -5);
    glVertex3f(-35, 80, -5);
    glVertex3f(-35, 75, -5);
    glVertex3f(-45, 75, -5);

glEnd();

注意每个实例中glBegin和glEnd之间的代码是如何相同的。

但GL_POLYGON(黄色)的顶点与GL_POINTS(红色)不匹配。 这是一个截图:

openGL bug

我使用openGL越多,我就越讨厌它。但我想这可能是我做错了......什么事了?

3 个答案:

答案 0 :(得分:5)

那是因为你的多边形不凸 - 右上角是凹的。 GL_POLYGON仅适用于凸多边形。

尝试使用GL_TRIANGLE_FAN代替并从左下角开始:您的多边形是星形的,因此如果从内核中的某个点开始,您可以使用单个GL_TRIANGLE_FAN绘制它(你的顶点,左下角是满足这个条件的唯一一个。)

如果你期望更复杂的多边形,你需要将它们分解成凸面(三角形最好)来渲染它们。

答案 1 :(得分:3)

规范说明了GL_POLYGON:

  

GL保证只能正确绘制凸多边形。如果一个   特定的多边形是非凸的   投射到窗口,然后   渲染多边形只需要在其中   凸出的凸包   顶点定义它的边界。

由于您要定义凹多边形,因此这是一种有效的行为。 尝试使用三角形条而不是多边形。它会快得多,因为GL需要对多边形进行三角测量。

BTW:到目前为止我还没有使用过GL_POLYGON。但我认为你不需要指定最后一个顶点(等于第一个顶点)。据我所知,它将自动连接。

答案 2 :(得分:1)

GLU Tesselator是一种将凹(和其他复杂)多边形自动转换为适当的opengl友好多边形的便捷方法。看看:

http://glprogramming.com/red/chapter11.html

http://www.songho.ca/opengl/gl_tessellation.html