1

我正在使用 libgdx 来创建一些程序。我需要在帧缓冲区中使用一些操作。对于此操作,我创建了新的帧缓冲区,在此操作之后,我在帧缓冲区 dispose() 中调用。当我创建帧缓冲区 10 次时,我的崩溃程序出现错误:无法构造帧缓冲区:尺寸不完整。我在代码 libgdx 中看到,这是帧缓冲区的 GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 状态。为什么会这样?我必须做些什么来解决这个问题?

代码:

 if(maskBufferer != null){
     maskBufferer.dispose();
 }
 maskBufferer = new FrameBuffer(Pixmap.Format.RGBA8888, width, height, true);
 mask = createMaskImageMask(aspectRatioCrop, maskBufferer);
 ...

private Texture createMaskImageMask(boolean aspectRatioCrop, FrameBuffer maskBufferer) {
    maskBufferer.begin();

    Gdx.gl.glClearColor(COLOR_FOR_MASK, COLOR_FOR_MASK, COLOR_FOR_MASK, ALPHA_FOR_MASK);
    Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT);
    float[] coord = null;

    ...
    PolygonRegion polyReg = new PolygonRegion( new TextureRegion(new Texture(Gdx.files.internal(texturePolygon)) ),
            coord);
    PolygonSprite poly = new PolygonSprite(polyReg);
    PolygonSpriteBatch polyBatch = new PolygonSpriteBatch();
    polyBatch.begin();
    poly.draw(polyBatch);
    polyBatch.end();

    maskBufferer.end();
    return maskBufferer.getColorBufferTexture();
}
4

2 回答 2

2

编辑

总而言之,GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS当创建太多FrameBuffer对象(没有调用.dispose())时,可能会在 libgdx 中发生,这可能与 OpenGL 耗尽 FBO 或纹理/渲染缓冲区句柄有关。

如果没有返回句柄,glGenFrameBuffers则在附加目标或检查状态时不会绑定 FBO。同样,尝试附加(从失败的调用到glGenTextures)无效目标将导致 FBO 将不完整。尽管在这两种情况下报告似乎都不正确GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS

一种可能性可能是为目标分配内存的调用,例如glTexImage2DglRenderbufferStorage已失败(内存不足)。这会使目标的尺寸不等于已成功连接到 FBO 的其他目标,然后可能会产生错误。


一次创建帧缓冲区、附加渲染目标并重用每个帧是非常标准的。处置是什么意思glDeleteFrameBuffers

看起来应该有delete maskBufferer;after 和 as maskBufferer.dispose();编辑如果它是 C++

鉴于此错误发生在多个帧之后,它可能是很多事情。仔细检查您没有在每帧创建帧缓冲区或附件,没有删除它们并用完对象/句柄。

它看起来GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS不再使用(参见规格),类似于现在具有混合尺寸的能力。似乎值得检查您的附件是否都相同大小。

缩小导致问题的附件的一种快速方法是注释掉其中的一半并查看错误发生的时间(或检查每个附件后的状态)。

于 2013-09-30T14:34:09.447 回答
1

我解决了问题。Dispose 得到了帮助。我每次都重新创建课程,因为从未调用过 dispose。

于 2013-10-01T08:11:11.753 回答