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

Posted

技术标签:

【中文标题】2D中的opengl glBegin(GL_LINES)和glBegin(GL_POINT)不可视化点向量【英文标题】:opengl glBegin(GL_LINES) and glBegin(GL_POINT) in 2D not visualizing point vector 【发布时间】:2018-10-20 22:16:07 【问题描述】:

我正在制作一个简单的 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】:
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.

【讨论】:

我确实在答案中添加了一个关于错误检查的部分。

以上是关于2D中的opengl glBegin(GL_LINES)和glBegin(GL_POINT)不可视化点向量的主要内容,如果未能解决你的问题,请参考以下文章

API OpenGL输出土元函数及相关子程序

旋转使用 OpenGL 绘制的 2D 对象

使用 OpenGL 进行像素完美的 2D 渲染

Qt/OpenGL 试图显示 2D 纹理

C ++ / OpenGL - 2D - 如何在矩形边界框中剪切圆

执行渐变时,OpenGL会跳过顶点