Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按需渲染帧_C++_Opengl_Glut - Fatal编程技术网

C++ 按需渲染帧

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

我目前正在创建一个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 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
    }

    .....
}