我用libgdx创建了一些程序。我需要在帧缓冲区中使用一些操作。对于此操作,我将创建新的框架缓冲区,在此操作之后,我将调用framebuffer ()。当我创建框架缓冲区10次时,我有错误的崩溃程序:无法构造帧缓冲区:不完全维度。我在代码libgdx中看到,这是framebuffer的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();
}发布于 2013-09-30 14:34:09
编辑
总之,当创建了太多的GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS对象(而不调用.dispose())时,FrameBuffer可能会出现在libgdx中,这可能与OpenGL耗尽FBO或纹理/呈现缓冲区句柄有关。
如果在glGenFrameBuffers中没有返回句柄,那么在附加目标或检查状态时,FBO将不会被绑定。同样,试图附加(从对glGenTextures的调用失败)无效的目标将导致FBO将是不完整的。尽管在这两种情况下报告GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS似乎都不正确。
一种可能是调用为目标分配内存,例如glTexImage2D或glRenderbufferStorage失败(内存不足)。这使得目标的尺寸不等于其他已经成功地附加到FBO的目标,然后可能产生错误。
创建一个框架缓冲区一次,附加您的呈现目标并重用每个框架是非常标准的。你所说的处置是指glDeleteFrameBuffers
看起来应该有delete maskBufferer;和maskBufferer.dispose();。编辑如果它是C++
考虑到这个错误发生在许多帧之后,可能会有很多事情发生。重复检查,您没有创建框架缓冲区或每个帧的附件,而不是删除它们并耗尽对象/句柄。
它看起来也像GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS is 不再使用 (参见规格),类似于现在具有混合维度的能力。这似乎是值得检查,但你的附件都是相同的大小。
缩小导致问题的附件范围的一个快速方法是注释掉其中的一半,并查看错误发生的时间(或在每个附加之后检查状态)。
发布于 2013-10-01 08:11:11
我解决了问题。处置工作得到了帮助。我每次都会重新创建类,因为dispose从来没有被调用过。
https://stackoverflow.com/questions/19096304
复制相似问题