略谈OpenGL中的共享上下文(EGL Context)

OpenGL渲染中有一个线程相关的上下文(EGL Context), OpenGL所创建的资源, 其实对程序员可见的仅仅是ID而已, 其内容依赖于这个上下文, 有时候为了方便起见, 在某个线程中创建了上下文之后, 所有的OpenGL操作都转到此线程来调用. 这样在简单的2d/3d 渲染中尚可, 但是如果涉及复杂的OpenGL渲染时, 这样就未必足够, 事实上OpenGL已经考虑到这一点, 上下文是可以在多个线程间共享的, 在使用eglCreateContext时, 可以传入一个已创建成功的上下文, 这样就可以得到一个共享的上下文(Shared Context).
举例来说, Google 为Android 的MediaCodec设计了一套基于OpenGL的Pipeline, 其覆盖的模块包括 视频采集(Video Capture), 视频前处理 (pre-processing), 视频编码(Encode), 视频解码(Decode), 后处理(post processing), 渲染(Render). 通常作设计的时候需要考虑架构的跨平台通用性, 所以上述的整个Pipeline 会在多个线程中工作. 当我们为这个架构设计高度优化的MediaCodec OpenGL Pipeline的时候, 就可以使用Shared Context的方式, 这样, 可以继续沿用跨平台的通用架构和线程模型, 设计思路也比较自然. 如果只为OpenGL创建一个工作线程, 强行把所有的操作转向此线程, 思路过于简单, 粗暴, 其实现必然丑陋. 这是我之前所犯过的设计的失误, 故为此记.

Reference

在Qt上使用EGL搭建OpenGL环境的步骤如下: 1. 在Qt创建一个新项目,选择“Empty Qt Project”模板。 2. 在项目文件夹创建一个新的文件夹,命名为“opengl”,然后在该文件夹创建一个新的文件,命名为“opengl.qrc”。 3. 在“opengl.qrc”文件添加你的OpenGL库,这样你的Qt项目就能够调用该库。 4. 在项目文件夹创建一个新的源文件,命名为“main.cpp”。 5. 在“main.cpp”文件添加以下代码: ```c++ #include <QGuiApplication> #include <QOpenGLContext> #include <QOpenGLFunctions> #include <EGL/egl.h> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); // 创建EGL显示连接 EGLDisplay eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(eglDisplay, 0, 0); // 配置EGL显示属性 EGLConfig eglConfig; EGLint numConfigs; EGLint configAttribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_NONE }; eglChooseConfig(eglDisplay, configAttribs, &eglConfig, 1, &numConfigs); // 创建EGL上下文 EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; EGLContext eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs); // 获取Qt的OpenGL上下文 QOpenGLContext *qtContext = QOpenGLContext::currentContext(); QSurface *qtSurface = qtContext->surface(); // 将Qt的OpenGL上下文EGL上下文关联 EGLSurface eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, (EGLNativeWindowType)qtSurface, NULL); eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext); // 初始化OpenGL函数 QOpenGLFunctions *gl = qtContext->functions(); // 在此处添加你的OpenGL代码 // 释放EGL上下文和显示连接 eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroySurface(eglDisplay, eglSurface); eglDestroyContext(eglDisplay, eglContext); eglTerminate(eglDisplay); return app.exec(); } ``` 6. 在代码添加你的OpenGL代码。 7. 编译并运行你的Qt项目,确保它能够正常工作。 这样,你就成功地在Qt使用EGL搭建了OpenGL环境。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值