4

私が開発しているペイント アプリでは、ユーザーが透明なブラシで描画できるようにしたいと考えています。たとえば、白い背景の上に黒いペイントが灰色になるはずです。塗り重ねると黒に近い色になります。

ここに画像の説明を入力

しかし、その場所に何回描画しても、結果の色は決して黒くなりません。実際、数行後に変更が停止します。Photoshop によると、OpenGL で左側に描画されたブロブのアルファは最大 0.8 であり、私はそれが 1 であると予想しています。

私のアプリは、Apple の GLPaint サンプルのように一連のスタンプを描画して線を形成することによって機能します。スタンプは、次の機能とブレンドされます。

glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE);
glBlendEquation(GL_FUNC_ADD);

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

uniform lowp sampler2D u_texture;
varying highp vec4 f_color;

void main(){
    gl_FragColor = texture2D(u_texture, gl_PointCoord).aaaa*f_color*vec4(f_color.aaa, 1);
}

繰り返し描画するときにフルカラーを取得するには、ブレンドをどのように構成すればよいですか?

2013 年 7 月 11 日更新

おそらく、最初にテクスチャに描画し、次にテクスチャを画面上に描画することにも注意する必要があります。テクスチャは、次のコードを使用して生成されます。

    glGenFramebuffers(1, &textureFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, textureFramebuffer);

    glGenTextures(1, &drawingTexture);
    glBindTexture(GL_TEXTURE_2D, drawingTexture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  pixelWidth, pixelHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

更新 2013/02/12 Apple の GLPaint プログラムを に変更してみましたが、この動作は iOS7 でのみ観察できることがわかりました。以下のスクリーンショットでわかるように、iOS 7 の色は少し薄く、うまく混ざりません。の

GL_ONE, GL_ONE_MINUS_SRC_ALPHA

ブレンド機能はiOS6でうまく機能します。この動作は、iOS7 の CALAyer の実装などによって引き起こされる可能性がありますか?どうすれば解決できますか?

iOS6iOS7

2014 年 10 月 7 日更新

Apple は最近、iOS7 の GLPaint サンプルを更新しましたが、そこでも問題が観察されます。コードに基づいて別のスレッドを作成しました: Unmodified iOS7 Apple GLPaint example blending issue

4

1 に答える 1

1

ブラシが画像を「暗く」したからといって、これが減算ブレンディングであるとは限りません。これは通常の加算ブレンディングの顔であり、黒いブラシは画像を単にオーバードローします。(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)ブレンディング機能(非分離)が必要です。ブラシはテクスチャのアルファ チャネル内にのみ含まれます。テクスチャにはカラー チャネルはありません。ブラシの色はglColorまたは同等のユニフォームによって決定されます。

ほとんどの場合、デスティネーション アルファ値を使用する必要はありません。

于 2013-11-02T18:27:17.313 に答える