【问题标题】:Draw OpenGL renderbuffer to screen将 OpenGL 渲染缓冲区绘制到屏幕上
【发布时间】:2016-02-15 16:53:29
【问题描述】:

我创建了一个渲染缓冲区,然后在 OpenCL 中对其进行了修改。

//OpenGL
glGenFramebuffers(1, &frameBuffer);

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

glGenRenderbuffers(1, &colorRenderbuffer);

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 600, 600);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
//OpenCL
renderEngine = new OpenCLProgram("render.cl");
renderEngine->addArgumentGLRBuffer(colorRenderbuffer);

然后我将如何继续绘制我的 OpenCL 创建,将缓冲区绘制到屏幕上?我可以将它绑定到纹理并绘制一个窗口大小的四边形,但我不确定它是否是最有效的方法。此外,如果有更好的从 OpenCL 绘制到屏幕的方法,那将有所帮助!

【问题讨论】:

    标签: opengl buffer opencl gpu render


    【解决方案1】:

    您正在寻找的电话是glBlitFramebuffer()。要使用它,您将 FBO 绑定为读取帧缓冲区,并将默认帧缓冲区绑定为绘制帧缓冲区:

    glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFbo);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
    glBlitFramebuffer(0, 0, srcWidth, srcHeight, 0, 0, dstWidth, dstHeight,
                      GL_COLOR_BUFFER_BIT, GL_NEAREST);
    

    根据链接的手册页为您的特定用途调整参数。

    这比编写自己的着色器和渲染屏幕大小的四边形更可取。它不仅更简单,并且需要更少的状态更改,而且还可以更高效。知道需要执行 blit 操作使实现有机会使用更有效的路径。例如,如果存在,它可以使用专用的 blit 引擎,该引擎可以与 GPU 的一般渲染功能异步运行。

    是否应该使用渲染缓冲区或纹理并没有那么明确。很有可能它不会有太大的不同。尽管如此,我还是建议您使用渲染缓冲区,只要这就是您所需要的。因为它的功能更有限,驱动程序可以选择创建更优化的内存分配。在某些硬件上,渲染到渲染缓冲区可能比渲染到纹理更有效,尤其是在您的渲染是像素输出受限的情况下。

    【讨论】:

      【解决方案2】:

      不要让它成为渲染缓冲区。

      OpenGL renderbuffers 的存在唯一目的是作为渲染目标。从它们读取的唯一 OpenGL 操作是在渲染到帧缓冲区期间的 per-sample operationsframebuffer blitspixel transfer operations

      改为使用纹理。您没有理由不能创建 600x600 GL_RGBA8 2D 纹理。

      【讨论】:

      • 像素转移操作也可用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2012-04-19
      相关资源
      最近更新 更多