在 OpenGL 中离屏渲染场景允许在不需要可见窗口的情况下生成图像。当为离屏处理执行大量计算或捕获图像以供以后使用时,此技术特别有用。
离屏渲染的一种方法是直接读取内容帧缓冲区。这可以使用 glReadPixels 函数来实现:
std::vector<std::uint8_t> data(width * height * 4); glReadBuffer(GL_BACK); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]);
此方法将像素从指定缓冲区(在本例中为后台缓冲区)读取到预分配的内存缓冲区中。然而,这种方法也有局限性,例如速度较慢,并且可能会干扰其他渲染操作。
帧缓冲对象 (FBO) 提供了一种更优化的方法渲染离屏。它们允许您创建一个专用的离屏帧缓冲区,可以独立地绘制和读取它:
GLuint fbo, render_buf; glGenFramebuffers(1, &fbo); glGenRenderbuffers(1, &render_buf); glBindRenderbuffer(render_buf); glRenderbufferStorage(GL_RENDERBUFFER, GL_BGRA8, width, height); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);
设置 FBO 后,您可以将其绑定为绘制目标并渲染到它,而不是默认帧缓冲区。当您准备好读取渲染像素时,将 FBO 绑定为读取目标:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); // Draw to the offscreen framebuffer glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); glReadBuffer(GL_COLOR_ATTACHMENT0); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]);
像素缓冲区对象 (PBO) 可以用于通过异步执行操作来提高像素传输效率:
GLuint pbo; glGenBuffers(1, &pbo); glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); glBufferData(GL_PIXEL_PACK_BUFFER, width * height * 4, NULL, GL_DYNAMIC_READ);
可以提供 PBO 的偏移量,而不是将指针传递给 glReadPixels 中的像素数据。稍后使用 glMapBuffer 将 PBO 映射到系统内存:
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0); // Offset in the PBO pixel_data = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
最佳的离屏渲染方法取决于应用程序的具体要求。 FBO 通常提供性能和灵活性的最佳平衡,而 PBO 在最大速度至关重要的情况下非常有用。对于简单的任务,直接读取帧缓冲区可能就足够了。
以上是如何在 OpenGL 中高效地离屏渲染?的详细内容。更多信息请关注PHP中文网其他相关文章!