我正在阅读第4版。在第2章中,示例代码设置回调,后面是清晰的颜色,如下所示:

main()
{
//...
glDisplayFunc(RenderScene);
SetupRC();
//..
}

void RenderScene(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glFlush();
}

void SetupRC(void)
{
  glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}

有没有可能我们有一个竞争条件,在这里glClear可能在glClearColor之前执行?

最佳答案

这不是竞争条件,因为glutMainLoop()在同一线程中运行,调用glDisplayFunc()不会调用任何GL函数(它只保存指向回调的指针)。
从文档中:
glutMainLoop进入GLUT事件处理循环。
在一个GLUT程序中,这个例程最多应该调用一次。
一旦调用,此例程将永远不会返回。
它将根据需要调用任何已注册的回调
OpenGL只能呈现给在同一线程中创建的GL上下文。因此,对glClearColor()RenderScene()的调用将在同一线程中调用。由于对glutMainLoop()的调用稍后在main()中调用,因此glClearColor()将严格在glClear()中的RenderScene()之前调用。

10-07 13:34