我正在使用libgdx来创建一些程序。我需要在framebuffer中使用一些操作。对于这个操作,我创建了新的帧缓冲区,在这个操作之后我调用了framebuffer 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();
}
答案 0 :(得分:2)
修改强>
总而言之,当创建了太多GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
个对象(没有调用FrameBuffer
)时,.dispose()
可能出现在libgdx中,可能与OpenGL耗尽FBO或纹理/渲染缓冲区句柄有关
如果没有glGenFrameBuffers
返回句柄,则在附加目标或检查状态时不会绑定FBO。同样地,尝试将(从失败的呼叫到glGenTextures
)附加到无效目标将导致FBO不完整。虽然在任何一种情况下报告GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
似乎都不正确。
一种可能性是调用为目标分配内存,例如glTexImage2D
或glRenderbufferStorage
失败(内存不足)。这使得目标的维度不等于已经成功附加到FBO的其他目标,然后可能产生错误。
创建一个帧缓冲区,附加渲染目标并重用每个帧是非常标准的。通过处置你的意思是glDeleteFrameBuffers
?
看起来应该delete maskBufferer;
以及maskBufferer.dispose();
。 编辑如果是C ++
鉴于此错误发生在多个帧之后,它可能是很多事情。仔细检查您是不是每帧都创建了帧缓冲区或附件,而不是删除它们并耗尽对象/句柄。
看起来GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS
似乎no longer used(参见the specs),这与现在具有混合维度的能力类似。似乎值得检查你的附件是否都是相同的大小。
缩小哪个附件导致问题的一种快速方法是将其中一半注释掉并查看错误发生的时间(或在每次附加后检查状态)。
答案 1 :(得分:1)
我解决了问题。处理得到了帮助。我每次都重新创建课程,因为处理从未打过电话。