opengl glBegin (GL_LINES) и glBegin (GL_POINT) в 2D не визуализирующем точечный вектор - PullRequest
0 голосов
/ 21 октября 2018

Я делаю простую 2D игру в пинг - понг.Теперь мне нужно визуализировать как игроков (две линии, одна вверху экрана и одна внизу), так и мяч.Однако я не знаю, почему мяч просто не визуализируется ... Вот часть кода.

 void displayScene()
    {
     glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(0, 0, 0);
        glLineWidth(33);
        glBegin(GL_LINES);
                glColor3f(0, 1, 0);
                glVertex2i(topPlayer->getLeftX(), topPlayer->getLeftY());
                glVertex2i(topPlayer->getRightX(), topPlayer->getRightY());
                glColor3f(1, 0, 0);
                glVertex2i(bottomPlayer->getLeftX(), bottomPlayer->getLeftY());
                glVertex2i(bottomPlayer->getRightX(), bottomPlayer->getRightY());
        glEnd();
        if (ball)
        {
            glPointSize(50);
            glColor3f( 0.0f, 0.0f, 0.0f );
            glBegin(GL_POINT);
                    glColor3f(1, 0, 0);
                    glVertex2i(ball->getX(), ball->getY());
                    ball->moveBall();
            glEnd();
        }
            glFlush();
    }

    int main(int argc, char *argv[])
    {
        glutInit(&argc, argv);
        glutInitWindowSize(1920, 1080);
        glutCreateWindow("Ping - Pong");
        glClearColor(1.0, 1.0, 1.0, 1.0);
        glOrtho(0, 1920, 1080, 0, -1, 1);
        topPlayer->setLeftY(1);
        topPlayer->setRightY(1);
        bottomPlayer->setLeftY(1920 - 1);
        bottomPlayer->setRightY(1080 - 1);
        glutDisplayFunc(displayScene);
        glutMainLoop();
        return 0;
    }

PS: ball->moveBall(); просто меняет шар x и y.Поскольку отладка бизнес-логики кажется хорошей, а координаты x, y меняются так, как они должны.Однако проблема заключается в визуализации шара.

PS PS: я знаю, что glBegin устарела, но я должен использовать устаревший код.

1 Ответ

0 голосов
/ 21 октября 2018
glBegin(GL_POINT);

Это просто генерирует ошибку GL_INVALID_ENUM (вы действительно должны добавить некоторую проверку ошибок в ваш код, по крайней мере, для отладочных сборок).Правильное значение перечисления равно GL_POINTS.

Однако все это ужасно устарело.Begin/End был в основном заменен массивами вершин еще в 1997 году, и буферными объектами где-то около 2003 года, и целым конвейером с фиксированными функциями шейдерами еще в 2004 году. Если вы делаете OpenGL в 2018 году, на самом деле нет причин дляпридерживайтесь 20-летних концепций, которые удалены из современных профилей ядра OpenGL.

ОБНОВЛЕНИЕ при проверке ошибок GL

Самый простой способэто позвонить glGetError() в "стратегических местах" в вашем коде.Обратите внимание, что это может привести к неявной синхронизации в вашей реализации GL, что может отрицательно повлиять на производительность.Хорошая стратегия состоит в том, чтобы использовать это только в отладочных сборках (или других опциях времени компиляции).

В наши дни гораздо лучше - GL * Отладочный вывод , где драйвер может точно сказать вамчто случилось.Например, в случае использования GL_POINT для примитивного типа драйвер nivida linux сообщает:

GL_INVALID_ENUM error generated. Invalid primitive mode.
...