C++ 按需渲染帧
我目前正在创建一个NTSC信号解码器/模拟器,基本上,我希望能够在渲染之前准备一个帧,例如,读取一个数组,处理数据,相应地绘制一些像素,然后渲染帧。我已经尝试摆脱C++ 按需渲染帧,c++,opengl,glut,C++,Opengl,Glut,我目前正在创建一个NTSC信号解码器/模拟器,基本上,我希望能够在渲染之前准备一个帧,例如,读取一个数组,处理数据,相应地绘制一些像素,然后渲染帧。我已经尝试摆脱glutMainLoop()东西,只需使用手工制作的环: for(;;) { glClearColor(0.0f, 0.5f, 0.5f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // Whatever I might have to do goes somewhere in
glutMainLoop()代码>东西,只需使用手工制作的环:
for(;;) {
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
但是,这不起作用,glClearColor
和glClear
,可能也会执行glFlush
,但只有一次,在那之后,程序就挂起了,我能做些什么来避免这种情况
我已经尝试摆脱glutMainLoop()代码>东西,只需使用手工制作的环
... 之后,程序就挂起了
这是一个坏主意,因为通常使用时获得事件处理的唯一方法是glutMainLoop()
见:
glutMainLoop
进入GLUT事件处理循环。在GLUT程序中,此例程最多应调用一次。一旦调用,此例程将永远不会返回。它将根据需要调用任何已注册的回调
注意,glutMainLoop()
不仅调用您通过glutDisplayFunc
设置的回调函数,它还接收和处理IO事件,如鼠标和键盘事件。如果不使用glutMainLoop()
,则没有事件处理,当然也没有IO事件处理。这会导致程序似乎挂起,对任何输入都不作出反应。
您必须使用glutMainLoop()
,或者必须切换其他窗口API,例如,您可以通过以下方式显式激活事件处理
GLUT的较新实现(如)提供了一些附加功能glutMainLoopEvent()
的作用与glutMainLoop()
相同,但它只执行一次。它对事件循环进行一次迭代,并立即返回控制。因此,您可以实现自己的循环来处理应用程序
e、 g
甚至可以设置一个不做任何事情的虚拟显示功能,并在循环中进行绘图:
e、 g
渲染帧后,通常需要调用某种SwapBuffers函数。但它是特定于平台的,不是GL本身的一部分。它有什么功能?你有一个无限循环,你已经删除了主事件循环,所以它可能没有得到更新事件。我无法判断你是否在使用传统的OpenGL,比如OpenGL 1,它在今天被认为是不推荐的,或者你是否在使用现代OpenGL,至少是版本3.3+到当前的4.6。无论您使用的是哪个版本;这个OpenGL在线教程中的网页很好地描述了OpenGL中的帧缓冲区!
void display( void )
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
int main()
{
.....
glutDisplayFunc(display);
.....
for(;;)
{
glutMainLoopEvent(); // handle the main loop once
glutPostRedisplay(); // cause `display` to be called in `glutMainLoopEvent`
}
.....
}
void dummyDisplay( void )
{
// does nothing
}
int main()
{
.....
glutDisplayFunc(dummyDisplay);
.....
for(;;)
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
glutMainLoopEvent(); // does the event handling once
}
.....
}