0

私はopengl esが初めてだったので、android4.1のサンプルコード「HelloEffect」を使用していくつかのテストを行いました。以下の関数を使用してレンダリングを行います。renderTexture の最後に "glCopyTexImage2D" 関数が呼び出されていない場合は、テクスチャを正しく再レンダリングできますが、glCopyTexImage2D 関数が使用されている場合は、2 回目に renderTexture を呼び出すと、GLToolbox.checkGlError("glViewport") が呼び出されます。例外をスローします。

 public void renderTexture(int texId, int savetexture) {
    if(savetexture == 2)
        texId = mCaptureTexture[0];

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
    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);
    GLES20.glUniform1i(mEffectTypeHandle, 1);

    // 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);

     if(savetexture == 1)
        GLES20.glCopyTexImage2D(mCaptureTexture[0], 0, GLES20.GL_RGBA, 0, 0, mTexWidth, mTexHeight, 0); 
    return;
}    

//main workflow

renderTexture(srctexture, 0);
renderTexture(srctexture, 0);
//+above steps is work normal.

renderTexture(srctexture, 1);
renderTexture(srctexture, 2);
//in above steps, when call  renderTexture(srctexture, 2)   
//gLToolbox.checkGlError ("glViewport")will throw exception  

これを行う目的は、フレーム バッファのカラー バッファのコピーを保持することです。texId テクスチャに対していくつかの後処理作業を行ったので、後処理作業を再度行う必要がなければ時間を節約できます。 . 上記のいくつかの重要な手順を省略したのでしょうか、それとも opengl es 2.0 はこの作業に完全ではありません!

4

1 に答える 1

0

の使用法と解釈はcheckGLError間違っている可能性があります。OpenGL エラー レポートはステートフルです。エラー フラグは、実際に確認するまでリセットされません

おそらく、ライン

GLES20.glCopyTexImage2D(...); 

エラーフラグを設定するものです。への次の呼び出しの後まで、チェック (およびリセット) しませんglViewPort

...

実際の問題について: 正確なエラー メッセージを投稿していただければ、その行の何が問題なのかについてさらに支援を提供できます。パラメータが正しく指定されていないようです。おそらく次のようになります

GLES20.glBindTexture( GLES20.GL_TEXTURE_2D, mCaptureTexture[0] );
GLES20.glCopyTexImage2D( GLES20.GL_TEXTURE_2D, ... );
于 2012-11-15T08:19:19.143 に答える