适用于OpenGL离屏渲染上下文的初始化代码
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离屏渲染上下文的初始化代码相关推荐
- OS X下使用OpenGL做离屏渲染
本文为转载内容,原地址 有时,我们想通过GPU做一些视频.图像处理,而处理的结果不需要显示在显示器上,而是直接交给主存,这时候我们可以通过OpenGL的离屏渲染来实现. 由于我们不需要将渲染好的像素显 ...
- Android OpenGL ES 离屏渲染(offscreen render)
通常在Android上使用OpenGL ES,都是希望把渲染后的结果显示在屏幕上,例如图片处理.模型显示等.这种情况下,只需要使用Android API中提供的GLSurfaceView类和Rende ...
- OpenGL基础33:帧缓冲(上)之离屏渲染
在之前的章节,所有的物体都是中规中矩的显示的,只考虑了光照对物体的影响,那假设想要显示特殊的效果该怎么操作呢?例如马赛克风.将所有的物体都显示为黑白色,就像上世纪80年代的灰白电视一样,又或者说将整个 ...
- iOS之从OpenGL深入探究离屏渲染及性能优化
一.探究内容 到底什么是离屏渲染?是在GPU上面还是CPU上面执行的? 为什么要有离屏渲染?什么情况下会产生离屏渲染? 帧缓冲区是什么?当前屏幕缓冲区和屏幕外缓冲区又是什么? 切换缓冲区是什么操作?真 ...
- OpenGL于MFC使用汇总(三)——离屏渲染
有时直接创建OpenGL形式不适合,或者干脆不同意然后创建一个表单,正如我现在这个项目,创建窗体不显示,它仅限于主框架.而我只是ActiveX里做一些相关工作,那仅仅能用到OpenGL的离屏渲染技术了 ...
- OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏渲染,解决透明冲突,画中画)
OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏录制,解决透明冲突) 1.水印签名罢工了? 不知道大家有没注意到,之前我们使用MediaCodec录制的视频,水印签名那部分区 ...
- OpenGL使用Frame Buffer Object(FBO)来进行离屏渲染
在OpenGL中,可以使用Frame Buffer Object(FBO)来进行离屏渲染,以生成纹理或者渲染缓冲区对象(Render Buffer Object).共4步,步骤如下: GLuint f ...
- android 离屏渲染 简单书,Android OpenGL ES 8.FrameBuffer离屏渲染
作用 FrameBuffer Object,也称FBO,离屏渲染,可以摆脱屏幕的束缚,在后台做图像处理. 理解 FrameBuffer和Texture绑定,FrameBuffer犹如画板,而Textu ...
- Android OpenGL ES (十)FrameBuffer离屏渲染
作用 FrameBuffer Object,也称FBO,离屏渲染,可以摆脱屏幕的束缚,在后台做图像处理. 理解 FrameBuffer和Texture绑定,FrameBuffer犹如画板,而Textu ...
最新文章
- 利用MEGA32制作辉光数码管显示电路
- 理解cookie和session
- CIKM 2021 | Google出品:将对比学习用于解决推荐系统长尾问题
- [css] css的user-select:all 有什么用处?
- dedecms 常用标签
- Python-Pandas
- [看过不再忘]详细解析chmod修改文件权限
- CRUD搬砖两三年了,怎么阅读Spring源码?
- VsCode下载,使用国内镜像秒下载
- Unity3D Editor Undo回退效果实现3 Odin相关
- 经典单片机c语言教程 pdf下载,51单片机经典教程.pdf
- unity黑白滤镜_unity图像优化美化滤镜渲染插件Beautify 6.2.7
- SSRF盲打 Collaborator everywhere
- Core Data概述
- python中scapy模块的使用
- 计算机风景画作品,电脑风景画图片大全
- linux看剩余电量命令,用Linux命令行检测笔记本电池用量
- 快速实现modbus PLC设备转换成BACnetIP MSTP协议的方案
- Blackhat 2012 USA 工具以及视频迅雷快传下载
- 1997年出生的人,现在月薪多少了?