我有以下代码:
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越多,我就越讨厌它。但我想这可能是我做错了......什么事了?
答案 0 :(得分:5)
那是因为你的多边形不凸 - 右上角是凹的。 GL_POLYGON
仅适用于凸多边形。
尝试使用GL_TRIANGLE_FAN
代替并从左下角开始:您的多边形是星形的,因此如果从内核中的某个点开始,您可以使用单个GL_TRIANGLE_FAN
绘制它(你的顶点,左下角是满足这个条件的唯一一个。)
如果你期望更复杂的多边形,你需要将它们分解成凸面(三角形最好)来渲染它们。
答案 1 :(得分:3)
规范说明了GL_POLYGON:
GL保证只能正确绘制凸多边形。如果一个 特定的多边形是非凸的 投射到窗口,然后 渲染多边形只需要在其中 凸出的凸包 顶点定义它的边界。
由于您要定义凹多边形,因此这是一种有效的行为。 尝试使用三角形条而不是多边形。它会快得多,因为GL需要对多边形进行三角测量。
BTW:到目前为止我还没有使用过GL_POLYGON。但我认为你不需要指定最后一个顶点(等于第一个顶点)。据我所知,它将自动连接。
答案 2 :(得分:1)
GLU Tesselator是一种将凹(和其他复杂)多边形自动转换为适当的opengl友好多边形的便捷方法。看看: