将OpenGL渲染缓冲区绘制到屏幕

时间:2016-02-15 16:53:30

标签: opengl buffer opencl gpu render

我创建了一个Renderbuffer,然后在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绘制到屏幕,这将有所帮助!

2 个答案:

答案 0 :(得分:3)

您正在寻找的电话是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的常规渲染功能异步运行。

是否应该使用渲染缓冲区或纹理不是那么明确。有可能它不会产生太大的影响。尽管如此,我还是建议您使用渲染缓冲区,只要您需要它即可。由于它具有更多有限的功能,因此驱动程序可以选择创建更适合此目的的内存分配。渲染到渲染缓冲区可能比渲染某些硬件上的纹理更有效,特别是如果渲染的像素输出有限。

答案 1 :(得分:2)

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

作为渲染目标的唯一目的存在OpenGL renderbuffers。在渲染到帧缓冲区per-sample operationsframebuffer blits期间,从中读取的唯一OpenGL操作为pixel transfer operations

使用纹理代替。没有理由你无法创建600x600 GL_RGBA8 2D纹理。