AndEngine RenderTexture异常:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

sjk*_*jkm 8 android opengl-es opengl-es-2.0 andengine

我开发了一款由很多人玩的Android游戏.100-200中的一个用户面临一个我无法理解的异常.

我使用RenderTexture,当我尝试初始化时抛出以下异常:

Fatal Exception: org.andengine.opengl.exception.RenderTextureInitializationException
org.andengine.opengl.exception.GLFrameBufferException: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
Run Code Online (Sandbox Code Playgroud)

它适用于所有设备的99%.init方法如下所示:

public void init(final GLState pGLState) throws GLFrameBufferException, GLException {
    this.savePreviousFramebufferObjectID(pGLState);

    try {
        this.loadToHardware(pGLState);
    } catch (final IOException e) {
        /* Can not happen. */
    }

    /* The texture to render to must not be bound. */
    pGLState.bindTexture(0);

    /* Generate FBO. */
    this.mFramebufferObjectID = pGLState.generateFramebuffer();
    pGLState.bindFramebuffer(this.mFramebufferObjectID);

    /* Attach texture to FBO. */
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, this.mHardwareTextureID, 0);

    try {
        pGLState.checkFramebufferStatus();
    } catch (final GLException e) {
        this.destroy(pGLState);

        throw new RenderTextureInitializationException(e);
    } finally {
        this.restorePreviousFramebufferObjectID(pGLState);
    }

    this.mInitialized = true;
}
Run Code Online (Sandbox Code Playgroud)

看起来FrameBuffer-Status有问题......

更新

到目前为止发生崩溃的手机列表:

Sony - Sony Tablet S
TCT - ALCATEL ONE TOUCH 5020A
TCT - ALCATEL ONE TOUCH 6030N
VNPT Technology - VNPT Technology Smart Box
Q-Smart - S32
LGE - LG-E465g
LGE - LG-D682TR
LGE - LG-E451g
LGE - LG-D686
LGE - LG-E470f
HUAWEI - MediaPad 7 Youth
unknown - Bliss Pad B9712KB
samsung - GT-P5110
samsung - GT-I9505
samsung - Galaxy Nexus
samsung - GT-P3110
samsung - GT-P5100
samsung - GT-P3100
samsung - GT-I9105P
samsung - GT-I9082
samsung - GT-I9082L
samsung - GT-I9152
samsung - GT-P3113
E1A - E1A
LNV - LN1107
motorola - XT920
motorola - XT915
asus - ME172V
Run Code Online (Sandbox Code Playgroud)

sol*_*xel 0

根据您链接到的代码,您似乎正在尝试渲染 RGBA8888 纹理。这并不总是在 OpenGL ES 2.0 设备上可用,因为它可以追溯到大多数设备使用 16 位显示器的时代。

OpenGL ES 2.x 中唯一的强制格式记录在规范中您收到的错误代码下......

RGBA8 目标仅在公开此扩展时才可用:

...所以很可能有些用户正在使用带有 GPU 的旧设备,而该设备没有公开此扩展。要检查扩展是否受支持,请使用glGetString(见下文)GL_EXTENSIONS

...并查看该OES_rgb_rgba8值是否存在于该列表中。如果不是,那么您唯一真正的选择就是退回到强制 ES2.x 格式集中的其他格式,例如 RGB565 或 RGB5_A1。