文档章节

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

jxt1234
 jxt1234
发布于 2015/10/15 18:05
字数 522
阅读 86
收藏 0

说明

最近做图像算法,需要用到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

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

© 著作权归作者所有

jxt1234
粉丝 5
博文 36
码字总数 41634
作品 0
杭州
私信 提问
【GoogleSamples】源码研究 - hello-gl2

简单介绍 hello-gl2项目是用来展示如何用jni的方式来使用OpenGL ES 2.0。所谓JNI的方式,是以Java代码为主,在Java代码中调用C++代码去实现功能。与之相对的,可以以C++代码为主,在C++代码中...

闪电的蓝熊猫
2018/05/19
0
0
iOS下 WebRTC 视频渲染

前言 今天为大家介绍一下 iOS 下 WebRTC是如何渲染视频的。在iOS中有两种加速渲染视频的方法。一种是使用OpenGL;另一种是使用 Metal。 OpenGL的好处是跨平台,推出时间比较长,因此比较稳定...

音视频直播技术专家
2017/10/08
0
0
通过FFmpeg解码和OpenGL的YUV转RGB实现Android视频播放

前言 在我的博文 https://blog.csdn.net/ericbar/article/details/80506390 中,我们在Android平台上,实现了通过FFmpeg在native(C/C++)层进行视频解码,并通过OpenGL实现了硬件渲染工作,...

ericbar
2018/05/30
0
0
OpenGL ES 绘制 3D 图形

OpenGL ES是 OpenGL三维图形API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。 Ophone目前支持OpenGL ES 1.0 ,OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 Op...

鉴客
2011/09/25
10K
4
关于opengl中多重纹理,离屏与渲染到屏幕切换,可编程管线有固定管线切换的理解

最近用opengl写项目时遇见几个问题,感觉比较通用写下啦分享; 一, opengl多重纹理的使用 二, opengl离屏渲染与渲染到屏幕切换使用 三, opengl可编程管线与固定管线切换使用 经过一个成功...

lixiaoguang20
2018/04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代码持续自动发布

需求: 自动更新私人gitbook项目代码 如果代码没更新,不做务必要的构建操作 思路 定时任务加shell脚本,无论更新没更新都执行git pull。 优点:能满足需求 资源浪费,代码仓库不更新也执行p...

阿dai学长
31分钟前
6
0
sparkstreaming原理

Spark Streaming是Spark生态系统当中一个重要的框架,它建立在Spark Core之上,下面这幅图也可以看出Sparking Streaming在Spark生态系统中地位。 Spark Streaming是Spark Core的扩展应用,它...

七旬少女
50分钟前
1
0
springmvc集成cas,并解决前后端分离情况

1.最近项目需要集成已经存在的cas系统。 但是目前已集成的系统都是jsp。而我们项目是前后端分离开发(伪),没有分开部署。 2.cas原理就不介绍了 网上例子很多。基本都是使用302重定向实现的...

起名字什么的太麻烦了
今天
4
0
HDFS-原理

1. 写操作 客户端要向HDFS写数据,首先要跟Namenode通信以确认可以写文件并获得接收文件block的Datanode,然后,客户端按顺序将文件逐个block传递给相应Datanode,并由接收到block的Datanod...

叶枫啦啦
今天
3
0
聊聊elasticsearch的MembershipAction

序 本文主要研究一下elasticsearch的MembershipAction MembershipAction elasticsearch-6.7.1/server/src/main/java/org/elasticsearch/discovery/zen/MembershipAction.java public class M......

go4it
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部