2016-09-26 75 views
8

我開發了一款由很多人玩的Android遊戲。 100-200中的一個用戶面臨一個我無法理解的異常。AndEngine RenderTexture例外:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

我使用RenderTexture當我嘗試初始化它會拋出以下異常:

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

它適用於所有設備的99%。該初始化方法是這樣的:

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; 
} 

好像事情是錯誤的幀緩存狀態...

更新

手機在事故發生至今的列表:

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 

回答

0

根據您鏈接的代碼,它看起來像是在嘗試渲染到RGBA8888紋理。這在OpenGL ES 2.0設備上並不總是可用,因爲它可以追溯到大多數設備使用16位顯示器的時候。

在OpenGL ES 2.x中唯一的強制性格式記錄在你所得到的錯誤代碼下的規範...

RGBA8目標是僅當此擴展曝光:

...所以它非常像一些用戶正在使用一個較舊的設備與GPU沒有公開這個擴展。要檢查擴展支持使用glGetString(見下文),同時GL_EXTENSIONS

...,看看OES_rgb_rgba8值出現在列表中。如果不是,那麼你唯一真正的選擇是回到強制ES2.x格式集中的其他東西,例如RGB565或RGB5_A1。

+0

謝謝你的回答 - 我非常感謝!是的,我正在嘗試呈現RGBA8888紋理。我在其上渲染Sprites/Textures(TextureOptions.BILINEAR_PREMULTIPLYALPHA) - 它們充當「郵票」。我可以改變什麼 - 你知道一個替代方案嗎?謝謝你,有一個美好的一天! – sjkm

+0

如果擴展名可用,則只呈現給RGBA8,否則返回到RGB565或RGB5_A1。缺乏一個體面的alpha通道可能會傷害你一點,這取決於你的精靈在做什麼,但如果該設備不支持RGBA8,我認爲你不會有太多的選擇。 – solidpixel

+0

謝謝!總結如下:遊戲不是真的可玩嗎?我如何檢查RGBA8000是否受支持?你知道是否有可能排除不支持它​​的設備(例如通過Manifest)?我是否有權說這是一個特定於設備的問題(因此排除有問題的設備下載應用程序會「解決」問題)?請原諒我用這麼多問題溢出你:)!非常感謝。 – sjkm