2016-09-26 83 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