首页 文章

glBufferData后需要glFlush吗? [重复]

提问于
浏览
0

这个问题在这里已有答案:

我需要调用glFlush(); glFinish();在我调用glBufferData或以CPU缓冲区作为输入的类似函数之后,确保所有CPU数据都被GPU消耗 . 这样的代码保证在没有崩溃的情况下工作:

GLfloat* buffer = malloc(1000*sizeof(GLfloat));
doSomeCalculation(buffer);    
glBindBuffer(GL_ARRAY_BUFFER, _someGlBuffer);
glBufferData(GL_ARRAY_BUFFER, 1000*sizeof(GLfloat), buffer, GL_DYNAMIC_DRAW);
// glFlush();
// glFinish();  //<<--- Is it required?
free(buffer);

1 回答

  • 2

    如果需要将GL状态与主机数据或GL↔CLInterop调用同步,则需要调用 glFinish . 交换缓冲区时将隐式调用此(或类似的调用),因此在大多数OpenGL的正常使用中,不需要调用它 .

    根据我的个人经验,我使用 glFinish 的一个场景是当我强迫GL绘制极其图形化的图像时,渲染整个图像需要花费60秒 - 在最佳情况下,这会导致操作系统重置图形驱动程序并导致程序崩溃,在最坏的情况下它会导致蓝屏死机,并且我会响应超过几秒钟 . 所以我重写了渲染循环,只是一次批量处理图像的小部分,一个循环(或多或少)看起来像这样:

    for(int x = 0; x < image_width; x += 32) {
        for(int y = 0; y < image_height; y += 32) {
            glViewport(x, y, 32, 32);
            glDrawArrays(GL_QUADS, 0, 4);
            glFinish();
        }
    }
    

    因此,如果您有一个用例,您担心单个绘图调用花费的时间太长,您可以将其拆分,并防止GL通过使用 glFinish 将它们拆分为一起来对后续绘制调用进行批处理 .

    但我的情况非常独特 . 一般来说,你不应该期望这样做 .

    编辑:

    glBufferData 的特定情况下,驱动程序在将控制权返回给主机代码之前缓冲数据,因此无需担心与主机同步 .

相关问题