2D中的opengl glBegin(GL_LINES)和glBegin(GL_POINT)无法可视化点向量

时间:2018-10-20 22:16:07

标签: c++ opengl graphics 2d glut

我正在制作一个简单的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();仅改变球xy。到目前为止,调试业务逻辑似乎很好,并且x,y坐标改变了必须的方式。但是问题在于球的可视化。

PS PS:我知道不建议使用glBegin,但是我必须使用旧版代码。

1 个答案:

答案 0 :(得分:1)

glBegin(GL_POINT);

那只是产生一个GL_INVALID_ENUM错误(您确实应该在代码中添加一些错误检查,至少对于调试版本而言)。正确的枚举值为GL_POINTS

但是,所有这些都是可怕的过时的。 Begin/End基本上在1997年被顶点数组取代,在2003年左右被缓冲区对象取代,而在2004年被着色器取代了整个固定功能管线。如果您在2018年使用OpenGL,则实际上没有坚持使用20年历史的概念的原因,这些概念都已从OpenGL的现代核心配置文件中被删除

有关GL错误检查的更新

最基本的方法是在代码的“战略位置”调用glGetError()。请注意,这可能会在GL实现中强制执行隐式同步,因此可能会对性能产生负面影响。一个好的策略是仅在调试版本(或其他编译时选项)中使用它。

如今,GL的Debug Output功能是一种更好的方法,驾驶员可以在其中准确地告诉您出了什么问题。例如,对于原始类型使用GL_POINT时,nivida linux驱动程序报告:

GL_INVALID_ENUM error generated. Invalid primitive mode.