bit*_*ise 19 c++ android opengl-es
我正在使用opengl/egl为Android开发.我的应用程序需要第二个上下文来从第二个线程加载纹理.
我的代码在android 2.3上工作正常,但是当我在4.0.3 android设备或模拟器上尝试代码时,eglMakeCurrent()在EGL_BAD_MATCH中失败.
第二个上下文和它的像素缓冲区的初始化也都可以正常工作,所以我不知道从哪里开始寻找这个错误.
这是初始化代码:
ANativeWindow *window = (ANativeWindow*)displaySurface;
EGLint dummy, format;
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, 0, 0);
EGLint contextAttribs[] =
{
    EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
};
const EGLint configAttribs[] =
{
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_BUFFER_SIZE, 32,
    EGL_DEPTH_SIZE, 24,
    EGL_NONE
};
EGLint numConfigs;
EGLConfig config;
eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(window, 0, 0, format);
surface = eglCreateWindowSurface(display, config, window, NULL);
if(surface == NULL)
    Trace("error creating window surface: " + GetEglError());
context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
if(context == NULL)
    Trace("error creating main context: " + GetEglError());
const EGLint auxConfigAttribs[] =
{
    EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_DEPTH_SIZE, 0,
    EGL_STENCIL_SIZE, 0,
    EGL_NONE
};
EGLint pbufferAttribs[] =
{
    EGL_WIDTH, 1,
    EGL_HEIGHT, 1,
    EGL_TEXTURE_TARGET, EGL_NO_TEXTURE,
    EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE,
    EGL_NONE
};
EGLint auxNumConfigs;
EGLConfig auxConfig;
eglChooseConfig(display, auxConfigAttribs, &auxConfig, 1, &auxNumConfigs);
auxSurface = eglCreatePbufferSurface(display, auxConfig, pbufferAttribs);
if(auxSurface == NULL)
    Trace("error creating pbuffer surface: " + GetEglError());
auxContext = eglCreateContext(display, auxConfig, context, contextAttribs);
if(auxSurface == NULL)
    Trace("error creating auxilliary context: " + GetEglError());
if(!eglMakeCurrent(display, surface, surface, context))
    Trace("could not make main context current: " + GetEglError());
在我的Android 2.3设备(HTC Desire)上,上面的初始化代码工作正常,我可以使auxContext当前,并加载纹理就好了.
但是,在我的android 4.0.3设备(Samsung Nexus S)和我的Android 4.1设备(Galaxy Note 2)上,eglMakeCurrent()在成功初始化后失败了EGL_BAD_MATCH.
有谁知道为什么我可能会收到此错误?
Mat*_*son 11
啊,我实际上知道的事情.;)[花了5年时间研究各种EGL实现的最佳部分].
我很确定你surface的格式与实际的显示表面不同.我不确定区别是什么,或者你需要改变什么.或许EGL_DEPTH_SIZE?您可以尝试枚举可用的模式,看看是否有"可能".我知道,这有点痛苦,但过去我曾经做过几次 - 不同之处在于我通常可以查看EGL源代码并找出我做错了什么...... ;)
如果你得到这个错误但没有处理这个表面或纹理的东西,去运行并输入.android转到AVD,你当前的Emulator通常在.img文件上删除用户日期文件,重新启动你的模拟器然后测试.这对我有用,如果它在您的设备上进行测试时发生,请清除数据并重新启动您的应用.为那些觉得有帮助的人干杯.
| 归档时间: | 
 | 
| 查看次数: | 31486 次 | 
| 最近记录: |