说明

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

代码

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

h文件

class GLContext
{
public:
class nativeContext;
static nativeContext* init(int version=2);
static void destroy(nativeContext* context);
}; class GLAutoContext
{
public:
GLAutoContext()
{
mContext = GLContext::init();
}
~GLAutoContext()
{
GLContext::destroy(mContext);
}
private:
GLContext::nativeContext* mContext;
};

cpp文件

#include "GL/GLContext.h"
#include <assert.h> #ifdef GL_BUILD_FOR_ANDROID
#include <EGL/egl.h>
class GLContext::nativeContext
{
public:
nativeContext()
{
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, 2,
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);
}
~nativeContext()
{
eglMakeCurrent(gDisplay, EGL_NO_SURFACE , EGL_NO_SURFACE , EGL_NO_CONTEXT);
eglDestroyContext(gDisplay, gContext);
eglDestroySurface(gDisplay, gSurface);
eglTerminate(gDisplay);
gDisplay = EGL_NO_DISPLAY;
} private:
EGLContext gContext;
EGLDisplay gDisplay;
EGLSurface gSurface;
};
#else
#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
class GLContext::nativeContext
{
public:
nativeContext()
{
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);
}
~nativeContext()
{
CGLReleaseContext(gContext);
}
private:
CGLContextObj gContext;
};
#else
#include <GL/glew.h>
#include <GL/glut.h>
#include <X11/Xlib.h>
#include <GL/glx.h>
class GLContext::nativeContext
{
public:
nativeContext()
{
gDisplay = XOpenDisplay(0);
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();
}
~nativeContext()
{
glXMakeCurrent(gDisplay, 0,0);
glXDestroyContext(gDisplay, gContext);
glXDestroyGLXPixmap(gDisplay, gGlxPixmap);
XFreePixmap(gDisplay, gPixmap);
XCloseDisplay(gDisplay);
gDisplay = NULL;
}
private:
GLXContext gContext;
Pixmap gPixmap;
GLXPixmap gGlxPixmap;
Display* gDisplay;
};
#endif
#endif GLContext::nativeContext* GLContext::init(int version)
{
return new nativeContext;
} void GLContext::destroy(nativeContext* context)
{
delete context;
}

适用于OpenGL离屏渲染上下文的初始化代码的更多相关文章

  1. opengl离屏渲染(不需要和窗口绑定,仅当作一个可以渲染一张图片的API使用)+ opencv显示

    具体过程参考的是这篇BLOG: http://wiki.woodpecker.org.cn/moin/lilin/swig-glBmpContext 这一片BLOG的代码有个 BOOL SaveBmp ...

  2. 初始化glew,创建OpenGL渲染上下文

    void RegisterWinDowClass(HINSTANCE hInstance,std::string className,WNDPROC proc) { WNDCLASS wndClass ...

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

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

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

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

  5. IOS 中openGL使用教程4(openGL ES 入门篇 | 离屏渲染)

    通常情况下,我们使用openGL将渲染好的图片绘制到屏幕上,但有时候我们不想显示处理结果,这时候就需要使用离屏渲染了. 正常情况下,我们将屏幕,也就是一个CAEAGLLayer对象作为渲染目标,离屏渲 ...

  6. 关于OpenGL Framebuffer Object、glReadPixels与离屏渲染

    最近写论文需要用到离屏渲染(主要是因为模型太大普通窗口绘制根本做不了),于是翻阅了红宝书查了下相关api和用法.中文版的红宝书可读性有点差,很多地方翻译地晦涩,但好歹读起来比较快,主要相关章节为第8章 ...

  7. 开始我的GL离屏渲染绑定[转]

    地址: http://wiki.woodpecker.org.cn/moin/lilin/swig-glBmpContext 呵呵,有了第一次的经验,我们就要开始我们的GL离屏渲染的绑定了. 关 于O ...

  8. WebGL简易教程(十三):帧缓存对象(离屏渲染)

    目录 1. 概述 2. 示例 2.1. 着色器部分 2.2. 初始化/准备工作 2.2.1. 着色器切换 2.2.2. 帧缓冲区 2.3. 绘制函数 2.3.1. 初始化顶点数组 2.3.2. 传递非 ...

  9. 离屏渲染学习笔记 /iOS圆角性能问题

    离屏渲染学习笔记 一.概念理解 OpenGL中,GPU屏幕渲染有以下两种方式: On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行. O ...

随机推荐

  1. django 开发之自定义日志器(二)

    2016-08-24 需求 在我们的真实环境中当我们出现错误的时候我们要记录下来,便于我们分析差错. 关于日志的代码文件 # 自定义日志输出信息 LOGGING = { 'version': 1, ' ...

  2. Centos6.6 系统优化

    1:最小化安装 2:修改网卡 vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0HWADDR=52:54:00:0e:c2:c3TYPE ...

  3. finger---用于查找并显示用户信息

    finger finger命令用于查找并显示用户信息.包括本地与远端主机的用户皆可,帐号名称没有大小写的差别.单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名 ...

  4. Python3+Gurobi使用教程(一)

    Gurobi使用教程 1.Gurobi使用的一般框架 from gurobipy import * try: m=Model('modelname') except GurobiError: prin ...

  5. 紫书 例题8-8 UVa 1471 (用set实现动态二分)

    设切割的区间为(j, i), 注意两边都是开区间. 然后可以预处理出以i为起点的最长连续递增的长度和以j为终点的最长连续递增的长度. 大致思路就是枚举i,右边这一侧的最优值就知道了, 然后这道题的关键 ...

  6. 【Henu ACM Round#24 A】k-String

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果是一个k-string的话. 考虑最后的串假设形式为sss..ss(k个s) 则s中出现的字母,整个串中最后出现的次数肯定为k的 ...

  7. groovy : poi 导出 Excel xlsx

    參考 file:///poi-3.10-FINAL/docs/spreadsheet/how-to.html#sxssf text2xlsx.groovy 代码例如以下 package xlsx; i ...

  8. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  9. WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml

    最近开始使用WebAPI,上手很容易,然后有些疑惑 1.WebAPI默认返回什么数据类型,json还是xml? 2.怎么修改WebAPI的返回数据类型,我用IE浏览器请 求返回的数据都是JSON格式的 ...

  10. thinkphp5项目--个人博客(五)

    thinkphp5项目--个人博客(五) 项目地址 fry404006308/personalBlog: personalBloghttps://github.com/fry404006308/per ...