【问题标题】:AndEngine RenderTexture Exception: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENTAndEngine 渲染纹理异常:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
【发布时间】:2017-02-03 18:50:11
【问题描述】:

我开发了一款多人玩的安卓游戏。 100-200 名用户中的一名用户面临我无法理解的异常。

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

Fatal Exception: org.andengine.opengl.exception.RenderTextureInitializationException
org.andengine.opengl.exception.GLFrameBufferException: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

它适用于 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;
}

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

【问题讨论】:

    标签: android opengl-es opengl-es-2.0 andengine


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答——非常感谢!是的,我正在尝试渲染为 RGBA8888 纹理。我在上面渲染 Sprites/Textures (TextureOptions.BILINEAR_PREMULTIPLYALPHA) - 它们充当“邮票”。我可以改变什么 - 你知道替代方案吗?谢谢你,祝你有美好的一天!
    • 仅在扩展可用时渲染为 RGBA8,如果不可用则回退到 RGB565 或 RGB5_A1。不过,缺少一个像样的 Alpha 通道可能会伤害到你,这取决于你的精灵在做什么,但如果设备不支持 RGBA8,我认为你没有太多选择。
    • 谢谢!这么总结:游戏真的不耐玩?如何检查是否支持 RGBA8000?您知道是否可以排除不支持它​​的设备(例如通过清单)?我是否可以说这是一个特定于设备的问题(因此从下载应用程序中排除有问题的设备会“解决”问题)?请原谅我让你问了这么多问题:)!非常感谢。
    • 关于如何检查扩展可用性的答案已更新。特定于设备 - 是的,它应该只影响具有 GPU 而没有扩展字符串的设备。我有点好奇哪些设备有问题——大多数 GPU 已经支持 RGBA8 很长时间了——所以如果你愿意分享,请做 ;)。
    • 感谢您的更新!是的,当然 - 我现在正在创建所有设备的列表。我尽快发布 - 我正在等待一些报告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多