6

OpenGL テクスチャ マスキングについて助けが必要です。私はそれを機能させていますが、他の方法で機能させるために他のブレンディング関数パラメーターを見つける必要があります。今私が持っています:

//Background 
...code...
    glBlendFunc(GL_ONE, GL_ZERO);
...code

//Mask
...code...
    glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ZERO);
...code...

//Foreground
...code
    glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
...code

マスクが透明な場合、前景の不透明度を 0 (背景テクスチャで塗りつぶす) に設定します。マスクの色に反応する必要があります。マスクの色に応じて前景の不透明度を設定するようなものです。たとえば、マスクが黒 (0.0,0.0,0.0) の場合、前景のその場所の不透明度は 0 (背景で塗りつぶされます) であり、マスクが白 (1.0,1.0,1.0) の場合、前景の不透明度は 1 (背景で塗りつぶされていません)。逆の結果になることもあります (白 = 不透明度 0、黒 = 不透明度 1)。色に応じて機能する必要があります。

私の現在の結果の視覚化は以下のとおりです。


バックグラウンド:
ここに画像の説明を入力

マスク(円は透明):
ここに画像の説明を入力

前景:
ここに画像の説明を入力

結果:
ここに画像の説明を入力


そして、私はそれが次のように機能することを望みます:

バックグラウンド:
ここに画像の説明を入力

マスク (円は白、背景は黒):
ここに画像の説明を入力

前景:
ここに画像の説明を入力

結果:
ここに画像の説明を入力


そのため、後で次のように使用できます。

バックグラウンド:
ここに画像の説明を入力

マスク (円は白、背景は黒):
ここに画像の説明を入力

前景:
ここに画像の説明を入力

結果:
ここに画像の説明を入力


@Gigi ソリューションを試す:
ここに画像の説明を入力

4

1 に答える 1

4

おそらくこれがあなたが望むものです:


1) 宛先イメージをクリアします。

glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

2) 背景を描画し、アルファ チャネルをマスクします。

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);

3) 「マスキング オーバーレイ」を描画し、カラー チャネルをマスキングします。

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);

4) 前景を描画し、ブレンドを有効にします。

glEnable(GL_BLEND);
glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE, GL_ZERO);

注: オーバーレイ イメージには、アルファ チャネルを指定する必要があります。

于 2012-07-18T15:42:54.960 に答える