0

私は実際にそのglBlendFunc()機能とその仕組みを理解していません。

他の dst カラーをオーバーライドしながら、デスティネーション ブラックをブラックにするブレンド モードはありますか?

色付きのエッジと形状を含む白黒のキャンバスがあります。キャンバスのどこにでもブラシを描画したいのですが、エッジを上書きしないので、画像が完全に色付けされても黒のままです。理想的には、目的地は滑らかにするためにエッジの周りに灰色があるため、灰色の色合いはブラシの色で着色されます。

ありがとうございました!

4

1 に答える 1

0

必要なのはglBlendFunc(GL_DST_COLOR, GL_ZERO).

ブレンド機能がどのように機能するかを説明するには: ブレンドする場合、ソースと宛先の 2 つの色があります。ソースは、適用しようとしている色です (テキスタイル、単色など)。Destination は現在バッファにある色です。の 2 つのパラメーターはglBlendFunc、元の色と目的の色を乗算してから結果の色を取得する方法を示します。

したがって、glBlendFunc(GL_DST_COLOR, GL_ZERO)(説明したように)白黒の宛先バッファがある場合、次のように動作します。

  • 目的の色が白 (1,1,1,1) で、たとえば (.1, .2, .3, 1) などの色を適用すると、結果は次のようになります。R = (.1, .2, .3, 1)*(1,1,1,1) + (1,1,1,1)*(0,0,0,0) = (.1, .2, .3, 1)
  • 目的の色が黒 (0,0,0,0) で、たとえば (.1, .2, .3, 1) などの色を適用すると、結果は次のようになります。R = (.1, .2, .3, 1)*(0,0,0,0) + (0,0,0,0)*(0,0,0,0) = (0, 0, 0, 0)
  • 目的の色が灰色 (.5,.5,.5,1.0) で、たとえば (.1, .2, .3, 1) などの色を適用すると、結果は次のようになります。R = (.1, .2, .3, 1)*(.5,.5,.5,1.0) + (.5,.5,.5,1.0)*(0,0,0,0) = (.05, .1, .15, 1)

あなたのこのケースは少し具体的ですが、ほとんどの場合、アルファチャンネルのみが使用されます. たとえば、最も一般的なブレンディングはglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)、ソース カラーがソース アルファで乗算され、デスティネーション カラーが 1.0 ソース アルファで乗算されることを意味するため、灰色の背景の上に .75 のアルファを持つ白い形状 RGB .5 (任意のアルファ) RGB all になり1.0*.75 + .5*(1.0-.75) = .75 + .125 = .875ます。

オーバーレイに他の種類のブレンドが必要な場合、この手順には費用がかかる可能性があることに注意してください。その場合、ステンシル バッファを調べる必要があります。もう 1 つの問題は、オーバーレイを描画しない場所に黒と白の部分を見たくない場合があることです。この場合、単純にデスティネーション アルファを使用してこのブレンディングを行うことglColorMaskができます。バッファのアルファ チャネルにのみ描画するのに役立ちます。この場合、「黒」領域には alpha .0 を、「白」領域には 1.0 を使用できます。次に使用するバッファ上に形状を描画しますglBlendFunc(GL_DST_ALPHA, GL_ZERO)

于 2014-06-12T07:09:40.573 に答える