2D 中的 opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 不可视化点向量
opengl glBegin(GL_LINES) and glBegin(GL_POINT) in 2D not visualizing point vector
我正在制作一个简单的 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 已被弃用,但我必须使用遗留代码。
glBegin(GL_POINT);
这只是生成了一个 GL_INVALID_ENUM
错误(您确实应该在代码中添加一些错误检查,至少对于调试版本而言)。正确的枚举值是 GL_POINTS
.
然而,所有这些都可怕过时了。 Begin/End
基本上在 1997 年被顶点数组取代,在 2003 年左右被缓冲区对象取代,在 2004 年被着色器取代整个固定功能管道。如果你在 2018 年做 OpenGL,真的没有有理由坚持 20 年的概念,这些概念都已从 OpenGL 的现代核心配置文件中删除。
关于 GL 错误检查的更新
最基本的方法是在代码中的 "strategic places" 处调用 glGetError()
。请注意,这可能会在您的 GL 实现中强制执行隐式同步,因此可能会对性能产生负面影响。一个好的策略是仅在调试版本(或其他编译时选项)中使用它。
如今更好的方法是 GL 的 Debug Output 功能,驱动程序可以准确地告诉您哪里出了问题。例如,在对基本类型使用 GL_POINT
的情况下,nivida linux 驱动程序报告:
GL_INVALID_ENUM error generated. Invalid primitive mode.
我正在制作一个简单的 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 已被弃用,但我必须使用遗留代码。
glBegin(GL_POINT);
这只是生成了一个 GL_INVALID_ENUM
错误(您确实应该在代码中添加一些错误检查,至少对于调试版本而言)。正确的枚举值是 GL_POINTS
.
然而,所有这些都可怕过时了。 Begin/End
基本上在 1997 年被顶点数组取代,在 2003 年左右被缓冲区对象取代,在 2004 年被着色器取代整个固定功能管道。如果你在 2018 年做 OpenGL,真的没有有理由坚持 20 年的概念,这些概念都已从 OpenGL 的现代核心配置文件中删除。
关于 GL 错误检查的更新
最基本的方法是在代码中的 "strategic places" 处调用 glGetError()
。请注意,这可能会在您的 GL 实现中强制执行隐式同步,因此可能会对性能产生负面影响。一个好的策略是仅在调试版本(或其他编译时选项)中使用它。
如今更好的方法是 GL 的 Debug Output 功能,驱动程序可以准确地告诉您哪里出了问题。例如,在对基本类型使用 GL_POINT
的情况下,nivida linux 驱动程序报告:
GL_INVALID_ENUM error generated. Invalid primitive mode.