2

XMLレイアウトをOpenGLサーフェスにレンダリングしようとしています。これは正しく機能し、レイアウトに3D効果を加えることができます。しかし、更新して再度レンダリングしようとすると、機能しません。いじってさまざまな機能を試してみると、最終的には黒いオブジェクト、表面の外部にあるウィジェットのグラフィックの破損、または変更なしの元のオブジェクトのいずれかになります。

ビューをビットマップに変換する私のコードは次のとおりです。

public static Bitmap toBitmap(final View view) {
    final Bitmap bitmap = Bitmap.createBitmap(400, 100,
            Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(bitmap);
    final Paint paint = new Paint();

    view.setDrawingCacheEnabled(true);

    final int width = MeasureSpec.makeMeasureSpec(canvas.getWidth(),
            MeasureSpec.EXACTLY);
    final int height = MeasureSpec.makeMeasureSpec(canvas.getHeight(),
            MeasureSpec.EXACTLY);
    view.measure(width, height);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

    canvas.drawBitmap(view.getDrawingCache(), 0, 0, paint);

    return bitmap;
}

次に、オブジェクトのコンストラクターで、次のように呼び出します。

public static int loadTexture(final Bitmap bitmap) {
    GLES20.glGenTextures(1, textureHandle, 0);

    if (textureHandle[0] != 0) {
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
                GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
                GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

        bitmap.recycle();
    }

    if (textureHandle[0] == 0) {
        throw new RuntimeException("Error loading texture.");
    }

    return textureHandle[0];
}

更新されたレイアウトでメソッドを再度呼び出すと、loadTexture()メソッドが黒くなります。私はさまざまな方法を試すための別の小さな方法を書きました:

public static int updateTexture(final Bitmap bitmap) {
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);

    GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, bitmap);
    //GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
    // GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);

    return textureHandle[0];
}

これにより、元のテクスチャは変更されず、エラーが発生します。

<qgl2DrvAPI_glTexSubImage2D:502>: GL_INVALID_VALUE
glStartTilingQCOM: 0x501

呼び出しにコメントを付けてtexSubImage2D()置き換えると、texImage2D()何も起こらず、エラーメッセージも生成されません。

誰かが私が間違ったことをしたかもしれないことに光を当てることができれば、それは大いにありがたいです。

ありがとう!

4

1 に答える 1

0

OpenGLスレッドからupdateメソッドを呼び出していますか?texSubImage関数を使用している場合は、テクスチャパラメータを再度指定する必要はありません。

于 2013-02-05T15:52:00.460 に答える