opengl es 初始化及android切后台opengl上下文丢失

来源:互联网 发布:淘宝这几天有啥活动 编辑:程序博客网 时间:2024/06/02 21:44

做ogre1.9 的 android版本适配时发现原有的gl上下文丢失会导致原有贴图资源全部失效,

而这个情况的发生仅仅是由app切进切出后台触发.找了一圈后发现ogre 1.10新版本已经解决了这个问题,

做版本升级时过了一遍egl的初始化过程.

附带我的依赖库集合,mit协议:https://bitbucket.org/mm_longcheng/mm_lib 

自用基础库和包装库就先不发了。


egl 简述:

       EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口。

主要数据结构有: 

    EGLDisplay   显示设备,依据不同平台实现不一样

    EGLSurface   窗口曲面,包含渲染缓冲区及位深等

    EGLContext   opengles 上下文


在windows上的初始化,参照ogre 1.10.8

实用方案并不是通常的

m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

而是采用windows本地化方法先创建native_display

HINSTANCE hInst = WinMain传进去的实例句柄;WNDCLASS wc = {......hInst,参数忽略};RegisterClass(&wc);mWindow = CreateWindowEx(......hInst,参数忽略);mNativeDisplay = GetDC(mWindow);mEglDisplay = eglGetDisplay(mNativeDisplay);
之后创建窗口曲面和gl上下文

EGLSurface mEglSurface = eglCreateWindowSurface(display, mEglConfig, (EGLNativeWindowType)mWindow, NULL);EGLContext mEglContext = eglCreateContext(mGLDisplay, glconfig, shareList, 0);

要使用opengl函数则需要

eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
这种数据结构使得对于不同的渲染表面使用一个gl上下文成为可能,

需要设备支持,android需要GLSurfaceView.setPreserveEGLContextOnPause类似的版本android api 11 以上,现代设备基本都支持.

在android上的初始化opengl环境通常使用SurfaceView而不是GLSurfaceView.在SurfaceHolder回调中来触发Surface的创建和销毁.

不详细列出,实现版本可以参看ogre 1.10.8 ogre\RenderSystems\GLSupport\src\EGL\WIN32\OgreWin32EGLWindow.cpp

中的_notifySurfaceDestroyed和_notifySurfaceCreated.

surfaceCreated(参数){      native_surface_created(参数);}surfaceDestroyed(参数){      native_surface_destroyed(参数);}native_surface_created(参数){     // 如果没有mEglSurface创建,构建需要的texture资源     // 如果有mEglSurface则简单做一次更新绑定,不必重新加载失效的texture资源}native_surface_destroyed(参数){    // 销毁mEglSurface,保留mEglContext(需要硬件版本支持)}


原创粉丝点击