做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(需要硬件版本支持)
}
本文探讨了在Ogre1.9的Android版本中遇到的OpenGL ES上下文丢失问题及其解决方案。通过升级到Ogre1.10并采用特定于Windows平台的EGL初始化方法,成功保留了OpenGL ES上下文,避免了资源失效。
6245





