1

Android で OpenGL テクスチャからアルファ チャネルを読み取る際に問題が発生しています。私はこのように呼びますglReadPixels

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

テストとして、次のようなフラグメント シェーダーを作成しました。

gl_FragColor = vec4(0.5, 0.5, 0.5, 0.5);

ピクセルごとに、{ 64, 64, 64, -1 } が返されます。

各レンダリングの前にこれを含め、アルファがRGB値と同じ方法で返されない理由を解決するために、あらゆる種類のことを試しました。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//Tried various blend functions
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

しかし、何をしても -1 が返ってきます。

これは Android の制限ですか、それとも何が欠けていますか?

注記として、違いがある場合はオフスクリーン FBO を使用しています。

編集:私がこれを行う場合:

int[] bits= new int[4];
glGetIntegerv(GL_RED_BITS, bits, 0);
glGetIntegerv(GL_GREEN_BITS, bits, 1);
glGetIntegerv(GL_BLUE_BITS, bits, 2);
glGetIntegerv(GL_ALPHA_BITS, bits, 3);

{ 8, 8, 8, 0 } を返します。

4

2 に答える 2

1

アルファチャンネルはブレンディングを制御します。通常、アルファチャンネルは使用した瞬間に失われます。アルファ チャネルにあったデータは、データ セットに既にあった色と色をブレンドするために使用されています。以下は使用できません。

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

アルファチャンネルを取り戻します。これが、RGB 値に対して 128 ではなく 64 を取得している理由であることに注意してください。元の各値 (128) は既存の黒と 50/50 でブレンドされ、64 の RGB が生成されます。

于 2013-01-30T12:10:55.023 に答える
0

問題が何であるかを解決しました。私のレンダー バッファ ストレージは 24 ビット モードに設定されていました。32ビットモードに変更すると、動作し始めました:

glRenderbufferStorage(GL_RENDERBUFFER, GLES11Ext.GL_RGBA8_OES, w, h);
于 2013-01-30T14:22:11.540 に答える