4

私はOpenGL ESAndroidが初めてです。しかし今、私OpenGL ES 2.0はいくつかの写真編集を行うために を使用する必要があります。Android 4.1.2 でサンプル コードを見つけました"Hello-effect"。これにより、写真の編集作業が完了し、ウィンドウにレンダリングされます。しかし今は、編集した写真をローカルのビットマップに保存する必要もあります。テクスチャから直接データを取得する方法があると思いますが、私が見つけた唯一の方法はglReadPixels(...). だから私はそれを使用しようとします:

私が行う最初のテスト:

  1. GLSurfaceView を使用して、android.media.effect API で編集された写真を表示します。
  2. GLSurfaceView を含む同じレイアウトにボタンを追加します。
  3. ボタンをクリックすると、 glReadPixels(...) を呼び出して写真データを取得します。しかし、ステップ3として、ボタンのデータしか取得できませんでした。
ボタンをクリックすると、ウィンドウのフレームバッファがボタンのコンテンツに置き換えられたと思います。

私が行う2番目のテスト:

  1. 編集した写真を保存するためにFBOを作成し、glReadPixels(...)を使って写真データを取得するのですが、黒い写真です。

コードは次のようになります。

public void renderTextureOffscreen (int texId) {
    // Bind default FBO
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, offScreenFrameBuffer[0]); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D, texId , 0);

    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
    if(status == GLES20.GL_FRAMEBUFFER_COMPLETE)
    {
        // Set viewport
        GLES20.glViewport(0, 0, mViewWidth, mViewHeight);
        GLToolbox.checkGlError("glViewport");

        // Disable blending
        GLES20.glDisable(GLES20.GL_BLEND);

        // Set the vertex attributes
        GLES20.glVertexAttribPointer(mTexCoordHandle, 2, GLES20.GL_FLOAT, false,
            0, mTexVertices);
        GLES20.glEnableVertexAttribArray(mTexCoordHandle);
        GLES20.glVertexAttribPointer(mPosCoordHandle, 2, GLES20.GL_FLOAT, false,
            0, mPosVertices);
        GLES20.glEnableVertexAttribArray(mPosCoordHandle);
        GLToolbox.checkGlError("vertex attribute setup");

        // Set the input texture
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLToolbox.checkGlError("glActiveTexture");
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId);
        GLToolbox.checkGlError("glBindTexture");
        GLES20.glUniform1i(mTexSamplerHandle, 0);

        // Draw
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
    }

私の質問は、私の推測が正しいかどうかです。また、FBO の方法として、仕事を完了するための重要なステップを失うことはありますか。

4

1 に答える 1

0

直後にピクセルを読み取ってみてください

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 

また、glReadPixels が適切なスレッド、つまりレンダラー サブクラスから呼び出されていることを確認してください。

もう1つ、FBOに使用されるテクスチャをシェーダーへの入力としてバインドしていることがわかりますが、それはできません。

RTTの後、結果をクワッドまたは画面上の何かにレンダリングしていると思いますか?

ピクセルを読み取るために使用している残りのコードを表示できますか?

于 2012-12-04T21:55:35.467 に答える