4

中央の黒の完全に不透明な色から端の完全に透明な色になる放射状グラデーション テクスチャ (RGBA) があります。

ボール.png

GLKit を使用する最近の OpenGL テンプレートを使用して、iOS プロジェクトをセットアップしました。テクスチャ機能を追加し、setupGL メソッドに次のコードを設定しました。

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

これらのテクスチャの 2 つ (それぞれに個別の z があります) を白い背景のオルソ プロジェクションで重ねると、次のようになります。

right.png

しかし、代わりに私はこれを取得します:

間違った.png

私の質問は単純です:なぜですか?OpenGL ES 2.0 のブレンディングはこの効果を達成できませんか? (以前は OpenGL ES 1.1 で動作していました) 私が見逃している一般的なものはありますか? 私のテクスチャのプリマルチプライド アルファの問題でしょうか? もしそうなら、それは私のPNGまたは私がそれをロードしている方法で奇妙なことでしょうか? GLKTextureLoader を使用してテクスチャをロードしています。

私が間違っている可能性は非常に高いですが、フラグメント シェーダーに到達する前にアルファ ブレンディングが発生するため、シェーダーの問題ではないことは理解しています。私のシェーダーは、情報を直接渡すだけです。(もしかしてこれが問題?)

頂点シェーダー:

attribute vec4 position;
attribute vec2 texCoordIn;

varying vec2 texCoordOut;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    texCoordOut = texCoordIn;
}

フラグメント シェーダー:

varying lowp vec2 texCoordOut;
uniform sampler2D texture;

void main()
{
    gl_FragColor = texture2D(texture, texCoordOut);
}

glBendFunc を次のように設定してみましたが、同じ結果が得られます。

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

ヒントや一般的なハングアップは大歓迎です。ありがとう!

4

2 に答える 2

2

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)と が同じ結果を生成する場合glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)、テクスチャのアルファは 1.0 に統一されていることになります。したがって、加法ブレンドに相当するものが得られ、表示される結果が得られます。どちらかといえば、アルファを事前に乗算してからアルファチャンネルを捨てているようです。

したがって、チェックすべき明らかなことは、(i) ディスク上のファイルです。(ii) テクスチャ読み込みコード。あなたが求めていない場合GLKTextureLoaderApplyPremultiplication(そしてそれはあなたのアルファチャンネルに影響を与えるべきではありません;おそらくディスクから直接ロードしていますか?)、疑惑は(i)に落ちますが、上で直接含めた画像は機能しているように見えます正しく。

ブレンドは、フラグメント シェーダーの後に発生します。問題をさらにデバッグするために、残りの情報を破棄して、たとえば、アルファ チャネルの値をアルファ = 1.0 の赤チャネルとして渡すことを試すことができます。

于 2012-10-16T02:58:48.927 に答える
1

まあ、私はばかです。実際に起こっているのは、私の頂点に関する単純な問題です。一度にすべてのテクスチャを描画するために単一の glDrawArrays 呼び出しを使用していましたが、縮退した三角形を作成するために四角形の間に余分な頂点を追加するのを忘れていました。つまり、基本的に 3 番目のボールが中央に押しつぶされて描かれていました。しかし、それはアルファブレンディングの問題のように見えました!

ここに大きなダミーがあります。

于 2012-10-18T19:41:51.527 に答える