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

做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(需要硬件版本支持)
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值