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多すぎる場合に libgdx で発生する可能性があります。これは、OpenGL が FBO またはテクスチャ/レンダーバッファ ハンドルを使い果たしていることが原因である可能性があります。FrameBuffer.dispose()

ハンドルが返されない場合、glGenFrameBuffersターゲットのアタッチ時またはステータスのチェック時に FBO はバインドされません。同様に、無効なターゲットに (失敗した呼び出しからglGenTextures) アタッチしようとすると、FBO が不完全になります。GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONSどちらの場合も報告するのは正しくないようですが。

1 つの可能性として、glTexImage2DまたはglRenderbufferStoragehas failed (out of memory) など、ターゲットにメモリを割り当てるための呼び出しが考えられます。これにより、ターゲットの寸法が、FBO に既に正常に接続されている他のターゲットと等しくないままになり、エラーが発生する可能性があります。


フレームバッファを一度作成し、レンダー ターゲットをアタッチして、各フレームを再利用するのはかなり標準的です。処分するとはglDeleteFrameBuffers

delete maskBufferer;after と だけでなく もあるはずmaskBufferer.dispose();です。C++の場合は編集

このエラーが多数のフレームの後に発生した場合、多くのことが考えられます。フレームバッファやアタッチメントをフレームごとに作成していないか、削除していないか、オブジェクト/ハンドルが不足していないかを再確認してください。

また、現在は使用されていないように見えますGL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS(仕様を参照)。ただし、添付ファイルがすべて同じサイズであることを確認する価値があるようです。

どの添付ファイルが問題を引き起こしているかを絞り込む簡単な方法は、それらの半分をコメントアウトして、いつエラーが発生するかを確認することです (または、各添付ファイルの後でステータスを確認します)。

于 2013-09-30T14:34:09.447 に答える
1

私は問題を解決しました。処分は助かりました。dispose が呼び出されなかったため、毎回クラスを再作成していました。

于 2013-10-01T08:11:11.753 に答える