Я написал код для рисования многоугольника, используя GL_POLYGON
примитивный режим OpenGL. Я предоставляю входные точки в виде массива. Вот мой код:
#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()
функция, в которой настроена проекция. Работает нормально после добавления звонка init1()
до звонка glutMainLoop()
,
Система координат по умолчанию в OpenGL имеет диапазон от -1 до 1 для x и y. Таким образом, без каких-либо вызовов для применения преобразования полигон с координатами, введенными в пример ввода, будет покрывать все окно, в результате чего будет полностью белое окно.
Обратите внимание, что 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 или более поздней версии для мобильных устройств.