使用GL_POLYGON在OpenGL中绘制多边形时获得意外输出

时间:2014-10-09 23:13:40

标签: c++ opengl graphics polygons

我编写了使用OpenGL的GL_POLYGON原始模式绘制多边形的代码。我提供输入点作为数组。这是我的代码:

#include <GL/freeglut.h>
#include <GL/gl.h>
#include <iostream>

using namespace std;

int Np;
double X[1000];
double Y[1000];

void init1()
{   
    glOrtho(-250.0, 250.0, -250.0, 250.0, -250.0, 250.0);
}

void func4()
{
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
    for (int i = 0; i < Np; i++) {
        glVertex2f(X[i], Y[i]);
    }
    glEnd();
    glFlush();
}

int main(int argc, char ** argv)
{
    cin >> Np;
    for (int i = 0; i < Np; i++) {
        cin >> X[i] >> Y[i];
    }
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(50, 50);
    glutCreateWindow("Polygon");
    glutDisplayFunc(func4);
    glutMainLoop();
    return 0;
}

上面的代码几乎没有为每个输入提供所需的输出。代码有什么问题?

例如,我使用以下输入进行测试:

4
-100 -100
-100 0
100 100
100 -100

我希望在黑色背景上绘制一个围绕窗口中心有4个顶点的白色多边形。

1 个答案:

答案 0 :(得分:2)

发布的代码从不调用init1()函数,这是设置投影的位置。在调用init1()之前添加对glutMainLoop()的调用后,它可以正常工作。

对于x和y,OpenGL中的默认坐标系的范围为-1到1。因此,在没有任何调用应用变换的情况下,在样本输入中输入坐标的多边形将覆盖整个窗口,从而形成完全白色的窗口。

请注意,glOrtho()通常在投影矩阵模式下调用。它在这个小例子中没有什么区别,但是一旦你使用更高级的功能,比如照明,它就很重要。 init1()函数应如下所示:

glMatrixMode(GL_PROJECTION);
glOrtho(-250.0, 250.0, -250.0, 250.0, -250.0, 250.0);
glMatrixMode(GL_MODELVIEW);

此外,我希望您了解您在此处使用的OpenGL功能已弃用,并且在最新版本的OpenGL中不再可用。如果您刚刚开始学习,您可能需要考虑使用更现代的版本,这意味着桌面系统上的OpenGL 3.2的核心配置文件,或移动设备上的OpenGL ES 2.0或更高版本。