0

この質問で@Stefan Monovのチュートリアルをフォローしました。すべてが機能しますが、ブラシで機能させる必要があります。私はそうする必要があります:

// Next, we want a blendfunc that doesn't change the color of any pixels,
// but rather replaces the framebuffer alpha values with values based
// on the whiteness of the mask. In other words, if a pixel is white in the mask,
// then the corresponding framebuffer pixel's alpha will be set to 1.
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);
// Now "draw" the mask (again, this doesn't produce a visible result, it just
// changes the alpha values in the framebuffer)
drawQuad(maskTexture);

静的なテクスチャではなく、動的な形状になります。つまり、ブラシウィッチを実装しようとしているのは、@Stefan Monov によって書かれたようなことをしているということです。したがって、この場所を他の - (void) 関数で実装して、座標が変更されたとき (ユーザーが描画したとき) に呼び出すことができるようにする必要があります。コードのシーケンスを変更するさまざまな方法を試しましたが、正しく動作しません。今私のバーシュコードは次のとおりです。

glEnable(GL_BLEND);
glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);
glPointSize(100);
glBegin(GL_POINTS);
glColorMask(1.0,1.0,1.0, 1.0);
glVertex2f(loc.x, loc.y);
glEnd();
glDisable(GL_BLEND);

マウスがドラッグされたときに呼び出されます。"loc" はドラッグされたマウスの座標です。もちろん、blendFunc とコードのシーケンスのため、現在はまったく機能していません。@Stefan Monovが説明したようにシーケンスを離れると機能しますが、マウスをドラッグすると1つのポイントが描画されてドラッグされます。ポイントを描画した後、他のテクスチャも再描画されているためです。少なくとも同様の解決策はありますか?


より明確にするために、アプリをどのように機能させたいかを示します。

元のコードは次のとおりです。

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ZERO);
drawQuad(backgroundTexture);

glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);
drawQuad(maskTexture);

glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
drawQuad(foregroundTexture);

現在、次のように機能しています。

  1. 背景を描画します
  2. マスクを描画します
  3. 前景を描画します

次のように動作する必要があります。

  1. 暗黒を描きます
  2. 前景を描画します
  3. マスクを描画します

しかし、描画の順序を変更すると、機能しなくなります。マスクを無視します。

期待される結果の写真: ここに画像の説明を入力

4

1 に答える 1

0

マスクを最後に描画しようとしても、まったく意味がありません。

マスクを描画すると、アルファ チャネルの内容が変更されるだけで、アルファ チャネル自体は最終的なイメージにはまったく表示されません。

マスクの唯一の用途は、その後に描画されるものを変更することです。

于 2012-07-03T19:11:45.393 に答える