0

よし、FBO を使用してテクスチャにレンダリングし、後でこのテクスチャを使用してクワッドに表示するアプリケーションを作成しました。

これは、FBO とテクスチャを初期化するために使用しているコードです。

    IntBuffer intBuffer = IntBuffer.allocate(1);
    GLES20.glGenFramebuffers(1, intBuffer);
    fbo = intBuffer.get(0);

    GLES20.glGenTextures(1, intBuffer);
    tex = intBuffer.get(0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex);
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fbo);

    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, tex, 0);

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

(1. 内のコードonDrawFrame())

問題はどこにコードを入れればいいのかわからないので、まずはonDrawFrame()メソッドにコードを入れていきます。これを行うと、テクスチャリングが正常に機能し、必要な結果が得られます。しかし、フレームごとに新しい FBO とテクスチャを作成しているため、しばらくするとアプリケーションが遅れ始め、最後にエミュレータがクラッシュします。

(2. 内のコードonSurfaceChanged())

その動作に気づいた後、コードをonSurfaceChanged()メソッドに入れることにしました。今回はアプリケーションはクラッシュしませんでしたが、テクスチャ全体が黒くなっています。テクスチャをクリアするか、その上に白いクワッドを描画しようとしましたが、何も機能しませんでした。そして、エラーを取得しようとすると、GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER)またはGLES20.glGetError()すべてが正常であると表示されます。

また、メソッド内のコードをonDrawFrame()if 句で囲み、一度だけ実行されるようにしました。その結果、黒いテクスチャーも得られます。

(3.onDrawFrame()とのコードonSurfaceChanged())

私が最後に試みたのは、コードを両方のメソッドに入れることでした。onDrawFrame()テクスチャを正常に動作させるコードラインが見つかるまで、メソッドのコードを削減したかったのです。しかし、アプリケーションを起動すると、クワッドがちらつき、黒いテクスチャから適切なテクスチャに変わりました。

1 つの方法で動作するため、テクスチャの表示に問題はありません。コードに深度バッファを追加しようとしましたが、結果は同じです。私のアプリケーションでは必要ないので、コメントアウトしました。

何が起こっているのか言える人はいますか?誰かが動作するアプリケーションを持っているが、私の何が問題なのかわからない場合は、Android プロジェクトをダウンロードできるチュートリアルが見つからなかったので、その人がプロジェクトをアップロードできればいいと思います。

4

1 に答える 1