0

私は OpenGL を初めて使用し、2 パス シェーダーを作成しようとしています。基本的に、2 つのフレーム バッファーと 2 つのシェーダー プログラムがあります。通常どおり最初のパスを実行し、結果のテクスチャを取得して 2 番目のシェーダーに入力として渡す必要があります。これはどのように行われますか?結果のテクスチャを次のテクスチャへの入力として使用する方法がわかりませんか?

ここにいくつかのコードがあります: このコードは、2 番目のフィルター プログラムと、プログラム内のいくつかの属性とユニフォームが正しくセットアップされていることを前提としています。

@Override
public void onDraw(final int textureId, final FloatBuffer cubeBuffer,final FloatBuffer textureBuffer){
    //this draws the first pass (this is tested and working)
    super.onDraw(textureId, cubeBuffer, textureBuffer);


    //change the program
    GLES20.glUseProgram(secondFilterProgram);

    //clear the old colors
    GLES20.glClearColor(0, 0, 0, 1);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);



    GLES20.glActiveTexture(GLES20.GL_TEXTURE3); //change the texture
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, secondFilterOutputTexture[0]);
    GLES20.glUniform1i(secondFilterInputTextureUniform, 3);


    cubeBuffer.position(0);
    GLES20.glVertexAttribPointer(secondFilterPositionAttribute, 2, GLES20.GL_FLOAT, false, 0, cubeBuffer);
    GLES20.glEnableVertexAttribArray(secondFilterPositionAttribute);

    textureBuffer.position(0);
    GLES20.glVertexAttribPointer(secondFilterTextureCoordinateAttribute, 2, GLES20.GL_FLOAT, false, 0, textureBuffer);
    GLES20.glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); //same as line from init

    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
    GLES20.glDisableVertexAttribArray(secondFilterPositionAttribute);
    GLES20.glDisableVertexAttribArray(secondFilterTextureCoordinateAttribute);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

}

ここでパズルのピースが欠けているような気がします。繰り返しますが、私は OpenGL に非常に慣れていないので、概念的にも助けていただければ幸いです

4

1 に答える 1

0

あなたが達成したいことは、Render to Textureと呼ばれます

Android でこれを行う方法についての小さなチュートリアルがここにあります: http://blog.shayanjaved.com/2011/05/13/android-opengl-es-2-0-render-to-texture/

于 2013-03-15T16:14:50.510 に答える