2019独角兽企业重金招聘Python工程师标准>>>

说明

最近做图像算法,需要用到shader对图像进行处理,用glut会有窗口,不适合写成UT测试用例,需要创建一个无窗口的OpenGL上下文。

代码

这部分代码其实是参考 Android的Skia 模块相关代码写的,适用于 Mac、EGL(Android)、X11(Ubuntu等Linux系统)平台。

h文件

#ifndef GL_GLCONTEXT_H
#define GL_GLCONTEXT_H
class GLContext {public:static bool init(int version=2);static void destroy();
};
#endif

cpp文件

#include "GL/GLContext.h"
#include <assert.h>#ifdef GL_BUILD_FOR_ANDROID
//适用于 Android 和其他使用 EGL 标准的平台
#include <EGL/egl.h>
static EGLContext gContext;
static EGLDisplay gDisplay;
static EGLSurface gSurface;
bool GLContext::init(int version)
{gDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);EGLint majorVersion;EGLint minorVersion;eglInitialize(gDisplay, &majorVersion, &minorVersion);EGLint numConfigs;static const EGLint configAttribs[] = {EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,EGL_RED_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_ALPHA_SIZE, 8,EGL_NONE};EGLConfig surfaceConfig;eglChooseConfig(gDisplay, configAttribs, &surfaceConfig, 1, &numConfigs);static const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, version,EGL_NONE};gContext = eglCreateContext(gDisplay, surfaceConfig, NULL, contextAttribs);static const EGLint surfaceAttribs[] = {EGL_WIDTH, 1,EGL_HEIGHT, 1,EGL_NONE};gSurface = eglCreatePbufferSurface(gDisplay, surfaceConfig, surfaceAttribs);eglMakeCurrent(gDisplay, gSurface, gSurface, gContext);return true;
}void GLContext::destroy()
{eglMakeCurrent(gDisplay, EGL_NO_SURFACE , EGL_NO_SURFACE , EGL_NO_CONTEXT);eglDestroyContext(gDisplay, gContext);eglDestroySurface(gDisplay, gSurface);eglTerminate(gDisplay);gDisplay = EGL_NO_DISPLAY;
}
#else
/*适用于Mac平台*/
#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
CGLContextObj gContext;
bool GLContext::init(int version)
{CGLPixelFormatAttribute attributes[] = {kCGLPFADoubleBuffer,(CGLPixelFormatAttribute)0};CGLPixelFormatObj pixFormat;GLint npix;CGLChoosePixelFormat(attributes, &pixFormat, &npix);assert(NULL!=pixFormat);CGLCreateContext(pixFormat, NULL, &gContext);CGLReleasePixelFormat(pixFormat);assert(NULL!=gContext);CGLSetCurrentContext(gContext);return true;
}
void GLContext::destroy()
{CGLReleaseContext(gContext);
}
#else
/*这个是以前用在Ubuntu系统中的,使用了glew以打开shader功能,适用于 XDisplay*/
#include <GL/glew.h>
#include <GL/glut.h>
#include <X11/Xlib.h>
#include <GL/glx.h>
static GLXContext gContext;
static Pixmap gPixmap;
static GLXPixmap gGlxPixmap;
static Display* gDisplay = XOpenDisplay(0);
bool GLContext::init(int version)
{int fbcount;static int visual_attribs[] = {GLX_X_RENDERABLE    , True,GLX_DRAWABLE_TYPE   , GLX_PIXMAP_BIT,None};GLXFBConfig *fbc = glXChooseFBConfig(gDisplay, DefaultScreen(gDisplay),visual_attribs, &fbcount);int best_fbc = -1, best_num_samp = -1;int i;for (i = 0; i < fbcount; ++i) {XVisualInfo *vi = glXGetVisualFromFBConfig(gDisplay, fbc[i]);if (vi) {int samp_buf, samples;glXGetFBConfigAttrib(gDisplay, fbc[i], GLX_SAMPLE_BUFFERS, &samp_buf);glXGetFBConfigAttrib(gDisplay, fbc[i], GLX_SAMPLES, &samples);if (best_fbc < 0 || (samp_buf && samples > best_num_samp))best_fbc = i, best_num_samp = samples;}XFree(vi);}GLXFBConfig bestFbc = fbc[best_fbc];XFree(fbc);XVisualInfo *vi = glXGetVisualFromFBConfig(gDisplay, bestFbc);gPixmap = XCreatePixmap(gDisplay, RootWindow(gDisplay, vi->screen), 10, 10, vi->depth);gGlxPixmap = glXCreateGLXPixmap(gDisplay, vi, gPixmap);XFree(vi);gContext = glXCreateNewContext(gDisplay, bestFbc, GLX_RGBA_TYPE, 0, True);glXMakeCurrent(gDisplay, gGlxPixmap, gContext);glewInit();return true;
}void GLContext::destroy()
{glXMakeCurrent(gDisplay, 0,0);glXDestroyContext(gDisplay, gContext);glXDestroyGLXPixmap(gDisplay, gGlxPixmap);XFreePixmap(gDisplay, gPixmap);gDisplay = NULL;XCloseDisplay(gDisplay);
}
#endif
#endif

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/jxt1234and2010/blog/517705

适用于OpenGL离屏渲染上下文的初始化代码相关推荐

  1. OS X下使用OpenGL做离屏渲染

    本文为转载内容,原地址 有时,我们想通过GPU做一些视频.图像处理,而处理的结果不需要显示在显示器上,而是直接交给主存,这时候我们可以通过OpenGL的离屏渲染来实现. 由于我们不需要将渲染好的像素显 ...

  2. Android OpenGL ES 离屏渲染(offscreen render)

    通常在Android上使用OpenGL ES,都是希望把渲染后的结果显示在屏幕上,例如图片处理.模型显示等.这种情况下,只需要使用Android API中提供的GLSurfaceView类和Rende ...

  3. OpenGL基础33:帧缓冲(上)之离屏渲染

    在之前的章节,所有的物体都是中规中矩的显示的,只考虑了光照对物体的影响,那假设想要显示特殊的效果该怎么操作呢?例如马赛克风.将所有的物体都显示为黑白色,就像上世纪80年代的灰白电视一样,又或者说将整个 ...

  4. iOS之从OpenGL深入探究离屏渲染及性能优化

    一.探究内容 到底什么是离屏渲染?是在GPU上面还是CPU上面执行的? 为什么要有离屏渲染?什么情况下会产生离屏渲染? 帧缓冲区是什么?当前屏幕缓冲区和屏幕外缓冲区又是什么? 切换缓冲区是什么操作?真 ...

  5. OpenGL于MFC使用汇总(三)——离屏渲染

    有时直接创建OpenGL形式不适合,或者干脆不同意然后创建一个表单,正如我现在这个项目,创建窗体不显示,它仅限于主框架.而我只是ActiveX里做一些相关工作,那仅仅能用到OpenGL的离屏渲染技术了 ...

  6. OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏渲染,解决透明冲突,画中画)

    OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏录制,解决透明冲突) 1.水印签名罢工了? 不知道大家有没注意到,之前我们使用MediaCodec录制的视频,水印签名那部分区 ...

  7. OpenGL使用Frame Buffer Object(FBO)来进行离屏渲染

    在OpenGL中,可以使用Frame Buffer Object(FBO)来进行离屏渲染,以生成纹理或者渲染缓冲区对象(Render Buffer Object).共4步,步骤如下: GLuint f ...

  8. android 离屏渲染 简单书,Android OpenGL ES 8.FrameBuffer离屏渲染

    作用 FrameBuffer Object,也称FBO,离屏渲染,可以摆脱屏幕的束缚,在后台做图像处理. 理解 FrameBuffer和Texture绑定,FrameBuffer犹如画板,而Textu ...

  9. Android OpenGL ES (十)FrameBuffer离屏渲染

    作用 FrameBuffer Object,也称FBO,离屏渲染,可以摆脱屏幕的束缚,在后台做图像处理. 理解 FrameBuffer和Texture绑定,FrameBuffer犹如画板,而Textu ...

最新文章

  1. 利用MEGA32制作辉光数码管显示电路
  2. 理解cookie和session
  3. CIKM 2021 | Google出品:将对比学习用于解决推荐系统长尾问题
  4. [css] css的user-select:all 有什么用处?
  5. dedecms 常用标签
  6. Python-Pandas
  7. [看过不再忘]详细解析chmod修改文件权限
  8. CRUD搬砖两三年了,怎么阅读Spring源码?
  9. VsCode下载,使用国内镜像秒下载
  10. Unity3D Editor Undo回退效果实现3 Odin相关
  11. 经典单片机c语言教程 pdf下载,51单片机经典教程.pdf
  12. unity黑白滤镜_unity图像优化美化滤镜渲染插件Beautify 6.2.7
  13. SSRF盲打 Collaborator everywhere
  14. Core Data概述
  15. python中scapy模块的使用
  16. 计算机风景画作品,电脑风景画图片大全
  17. linux看剩余电量命令,用Linux命令行检测笔记本电池用量
  18. 快速实现modbus PLC设备转换成BACnetIP MSTP协议的方案
  19. Blackhat 2012 USA 工具以及视频迅雷快传下载
  20. 1997年出生的人,现在月薪多少了?

热门文章

  1. Android Activity的生命周期
  2. Perl5的OOP学习笔记
  3. (灌水)如何限制一个WinForm应用程序只能在一个进程运行
  4. Windows数据类型探幽——千回百转你是谁?(2)
  5. python语法面试题_Python语法面试题
  6. Python 复数属性及操作介绍
  7. 如何系统的学习单片机?
  8. 三次握手和四次挥手图解_图解 TCP 三次握手和四次挥手
  9. mqtt 传文件断开连接的原因_mqtt 发送消息断开链接
  10. poj3122(二分算法)