OpenGL离屏渲染保存图片

学习新知识只有结合实际使用才能真正掌握,之前看过几遍OpenGL的离屏渲染机制,但都不得要领,直到最近因为实际工作需要边看边做笔记边运用才算掌握了。

本文以离屏渲染技术为基础,说明如何通过读取离屏渲染的像素绘制保存为图片。

OpenGL的离屏渲染,跟屏幕渲染相比,区别主要在于需要自己定义RenderBuffer和FrameBuffer,将RenderBuffer绑定到FrameBuffer上。

其他的绘图流程跟屏幕渲染流程是一样的。

以下为RenderBuffer和FrameBuffer的创建和初始化相关代码。

glViewport(0, 0, showWidth, showHeight);

GLuint fbo, rbo;

glGenRenderbuffers(1, &rbo);

glBindRenderbuffer(GL_RENDERBUFFER, rbo);

glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, showWidth, showHeight);

glBindRenderbuffer(GL_RENDERBUFFER, 0);

glGenFramebuffers(1, &fbo);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

在创建和初始化完RenderBuffer和FrameBuffer后,开始绘制和读取像素。绘制的方式跟屏幕渲染一样,主要是以下几个步骤。

1. 创建、加载、编译着色器。

2. 创建、绑定纹理。

3. 将纹理坐标和顶点坐标相绑定映射。

而离屏渲染像素的读取,可以通过glReadPixel来实现,这里需要注意的是读取出来的像素格式和纹理渲染时格式是一致的。

glColor3f(0.0, 1.0, 0.0);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

glDrawBuffer(GL_COLOR_ATTACHMENT0);

pDrawer->Draw(showWidth, showHeight, panorama, logo);//自定义实现的纹理绘制函数

glReadBuffer(GL_COLOR_ATTACHMENT0);

glPixelStorei(GL_PACK_ALIGNMENT, 1);

glReadPixels(0, 0, showWidth, showHeight, GLenum(GL_BGR),       GLenum(GL_UNSIGNED_BYTE), m_pBGRBuf);//将读出的像素保存在m_pBGRBuf中。

glBindRenderbuffer(GL_RENDERBUFFER, 0);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

要将glReadPixels读取出来的像素保存为图片,可以通过QT的QImage来实现。将读出保存在m_pBGRBuf、showWidth、showHeight以及指定像素格式作为参数传递给QImage。

QImage image(m_pBGRBuf, showWidth, showHeight, QImage::Format_RGB888);

image.save("Capture.jpg", "JPG");

在学习OpenGL的过程中推荐以下网络资料,本文有参考。

http://www.songho.ca/opengl/gl_fbo.html

https://learnopengl.com/Advanced-OpenGL/Framebuffers

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本篇主要讲解GPUImage底层是如何渲染的,GPUImage底层使用的是OPENGL,操控GPU来实现屏幕展示 ...
    wo不懂阅读 2,276评论 4 4
  • 绘制到其他渲染目的地 Framebuffer对象是渲染命令的目标。当您创建一个framebuffer对象时,您可以...
    孙健会员阅读 1,211评论 0 3
  • framebuffers是渲染命令的目的地。当你创建一个framebuffer对象,你就对color、depth和...
    剁椒鸡蛋zy阅读 1,857评论 1 0
  • 1 纹理基础 纹理是一种结构化的存储形式(Textures are a structured form of st...
    RichardJieChen阅读 16,137评论 0 10
  • 最近身体状况一直非常糟,一度以为自己会昏倒在九型课堂上,但我扛过来了。回来后各种疲惫加复杂情绪袭来,让我更加无力,...
    蝈蝈的窝阅读 385评论 6 0