よし、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 プロジェクトをダウンロードできるチュートリアルが見つからなかったので、その人がプロジェクトをアップロードできればいいと思います。