将 OpenGL 渲染缓冲区绘制到屏幕
Draw OpenGL renderbuffer to screen
我创建了一个 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 创建,将缓冲区绘制到屏幕上?我可以将它绑定到纹理并绘制一个大小为 window 的四边形,但我不确定这是否是最有效的方法。此外,如果有更好的方法从 OpenCL 绘制到屏幕,那将会有所帮助!
不要将其设为渲染缓冲区。
OpenGL renderbuffers exist for the sole purpose of being render targets. The only OpenGL operations that read from them are per-sample operations during rendering to the framebuffer, framebuffer blits, and pixel transfer operations.
改用纹理。没有理由不能创建 600x600 GL_RGBA8
2D 纹理。
您要找的电话是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 操作可以让实现有机会使用更有效的路径。例如,如果存在,它可以使用可以 运行 与 GPU 的一般渲染功能异步的专用 blit 引擎。
您是否应该使用渲染缓冲区或纹理并不明确。很可能它不会产生太大的影响。尽管如此,我还是建议您使用渲染缓冲区,只要这就是您所需要的。因为它的功能更有限,所以驱动程序可以选择创建更优化的内存分配。在某些硬件上渲染到渲染缓冲区可能比渲染到纹理更有效,特别是如果您的渲染像素输出受限。
我创建了一个 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 创建,将缓冲区绘制到屏幕上?我可以将它绑定到纹理并绘制一个大小为 window 的四边形,但我不确定这是否是最有效的方法。此外,如果有更好的方法从 OpenCL 绘制到屏幕,那将会有所帮助!
不要将其设为渲染缓冲区。
OpenGL renderbuffers exist for the sole purpose of being render targets. The only OpenGL operations that read from them are per-sample operations during rendering to the framebuffer, framebuffer blits, and pixel transfer operations.
改用纹理。没有理由不能创建 600x600 GL_RGBA8
2D 纹理。
您要找的电话是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 操作可以让实现有机会使用更有效的路径。例如,如果存在,它可以使用可以 运行 与 GPU 的一般渲染功能异步的专用 blit 引擎。
您是否应该使用渲染缓冲区或纹理并不明确。很可能它不会产生太大的影响。尽管如此,我还是建议您使用渲染缓冲区,只要这就是您所需要的。因为它的功能更有限,所以驱动程序可以选择创建更优化的内存分配。在某些硬件上渲染到渲染缓冲区可能比渲染到纹理更有效,特别是如果您的渲染像素输出受限。