美文网首页
OpenGL离屏渲染保存图片

OpenGL离屏渲染保存图片

作者: lzgnanjing | 来源:发表于2018-06-17 14:46 被阅读0次

学习新知识只有结合实际使用才能真正掌握,之前看过几遍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

相关文章

  • OpenGL离屏渲染保存图片

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

  • 离屏渲染,OpenGL的三种渲染方式

    一. 离屏渲染触发的原理:APP在对图片进行渲染,合并的时候会触发离屏渲染,离屏渲染流程先把图层保存在帧缓冲区(o...

  • Android OpenGL ES 九. FBO离屏渲染(转载补

    离屏渲染(FrameBufferObject)今天为大家介绍离屏渲染的概念。在OpenGL中,GPU屏幕渲染有以下...

  • iOS 界面流畅 - 离屏渲染

    离屏渲染往往会带来界面卡顿的问题,这里将会讨论 当前屏幕渲染、离屏渲染 以及 CPU 渲染 在 OpenGL 中,...

  • OpenGL离屏渲染

    先看一个例子1.背景图片 2.背景颜色加背景图片 3.不存在背景图片 4.只设置图片无背景色 其中1,3,4产生了...

  • iOS触发离屏渲染

    在OpenGL中,GPU有2种渲染方式 离屏渲染消耗性能的原因需要创建新的缓冲区离屏渲染的整个过程,需要多次切换上...

  • OpenGL纹理内容

    纹理可以理解为一张图片,OpenGL渲染图片会将图片的像素保存在纹理缓存中。 OpenGL常用纹理函数 载入纹理 ...

  • OpenGL纹理

    纹理可以理解为一张图片,OpenGL渲染图片会将图片的像素保存在纹理缓存中。OpenGL常用纹理函数 载入纹理 纹...

  • 离屏渲染与OpenGL渲染结构

    大纲 理解离屏渲染 OpenGL渲染结构 着色器 OpenGL 基础图元/基本图元连接 理解离屏渲染 正常渲染流程...

  • iOS-圆角图片

    1. 离屏渲染:最简单方式 2. 非离屏渲染:给UIImage添加生成圆角图片

网友评论

      本文标题:OpenGL离屏渲染保存图片

      本文链接:https://www.haomeiwen.com/subject/bdcweftx.html