5

私は、ユーザーが と対話しGLSurfaceViewて画面上に図形を描画できるプロジェクトに取り組んできました。これはすべてうまく機能しますが、今は 2 つのことを試みています。1) 図面のサムネイルを作成し、2) 図面を保存します。ユーザーは画面よりも大きな画像を描画できることに注意してください。

私の調査が示す限り、これはBitmap(1) サムネイルの にレンダリングされ、Canvas2) ファイル システムに保存され、私の両方の目標を達成することを使用して最もよく達成されます)。

最初に、 viaRendererからを読み取ろうとしましたが、これからオフスクリーン データを取得できませんでした。代わりに、オフスクリーン バッファを使用してイメージのレンダリングを生成することにしました。これは.GLSurfaceViewglReadPixelsBitmap

私が現在使用している というクラスのコードを提供する素敵な投稿を見つけました。PixelBuffer(私はいくつかの微調整を行いましたが、私が経験したすべての問題は、微調整の有無にかかわらず発生しました。)

ここで、コードの を使用すると (フォーラム スレッドが読めないgetBitmap()場合に備えて以下に投稿します)、大量の. 最初はこれがおかしいと思ったので、調べてみました。何らかの理由で、クラスが OpenGL ES 2.0 を使用しているのに対し、GLSurfaceView は OpenGL ES 1.1 を使用していることが判明しました。私が使用しているデバイス (Galaxy Nexus) は 2.0 をサポートしていません。(さらに、可能な限り幅広いデバイスをサポートしたいと考えています。)PixelBuffercalled unimplemented OpenGL ES APIPixelBuffer

それで、ここに私の質問がありますPixelBuffer:クラスに OpenGL ES 1.1 APIを強制的に使用させるにはどうすればよいですか? マニフェストに次のものを既に追加しました。

<uses-feature android:glEsVersion="0x00010001" />

さらに、を使用してバージョンを設定しようとしましたがint[] version = new int[] { 1, 1 };、役に立ちませんでした。

PixelBuffer私が使用しているコード: Link . を呼び出す問題の行はRenderer91 行目です。バージョン コードは 39 行目以降にあります。

これは、オブジェクトPixelBufferから呼び出されるを作成するために使用するコードです。GLSurfaceView

    setEGLConfigChooser(8, 8, 8, 8, 0, 0);
    mRenderer = new MyRenderer(this);
    setRenderer(mRenderer);
    mPixelBuffer = new CPPixelBuffer(1440, 1280); // TODO Temporary hardcode for Galaxy Nexus wallpaper size
    mPixelBuffer.setRenderer(mRenderer);

オフスクリーン レンダリングにバージョン 1.1 を使用できない場合、GL サーフェスBitmapをバージョン 1.1 以下のバージョンに変換する最良の方法は何ですか?

編集:いくつかのテストを通じて、以下のコードを使用するとこれらのエラーが発生することがわかりました:

// int[] version = new int[2];
int[] version = new int[] { // When using this line, as well as the other marked lines, instead of the line above, the errors are produced.
    1, 1 // Marked
}; // Marked
int[] attribList = new int[] {
    EGL_WIDTH, mWidth,
    EGL_HEIGHT, mHeight,
    EGL_VERSION, 1, // Marked
    EGL_NONE
};

06-11 15:41:52.316: E/libEGL(5618): eglMakeCurrent:674 error 3009 (EGL_BAD_MATCH)
06-11 15:41:52.316: E/libEGL(5618): call to OpenGL ES API with no current context (logged once per thread)

ただし、これらのセットアップのいずれも目前の問題を軽減しません。どちらも私の PasteBin されたコードに存在するだけなので、指摘しておくとよいと思いました。

4

1 に答える 1

2

なんらかの理由でコメント投稿へのリンクが見つかりませんでしたので、回答として投稿して申し訳ありません。GLスレッドについては、通常、GLスレッドは

public void onDrawFrame(GL10 gl)

これはレンダラーの方法です。すべてはこのメソッド内で実行する必要があります。たとえば、ブール値をレンダラーに入れて、レンダラーで何かを実行したいときにtrueに設定するだけで、それだけです。このメソッドの外部で呼び出しを行うと、エラーが発生します。

また、この例を見てください: Android OpenGLスクリーンショット 私はそれを使用しました、そしてそれは私のために働きました、しかし私はオフスクリーン領域を保存する必要がなかったので、それがうまくいくかどうかわかりません、多分そうではありません:)

メソッドはonDrawFrame内で呼び出す必要があります

于 2012-06-14T06:42:32.267 に答える