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

Getting unexpected output while drawing polygon in OpenGL using GL_POLYGON

本文关键字:多边形 输出 意外 绘制 GL POLYGON OpenGL 使用      更新时间:2023-10-16

我已经编写了使用 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 个顶点。

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

OpenGL 中的默认坐标系对于 x 和 y 的范围为 -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或更高版本。