この質問で@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);
現在、次のように機能しています。
- 背景を描画します
- マスクを描画します
- 前景を描画します
次のように動作する必要があります。
- 暗黒を描きます
- 前景を描画します
- マスクを描画します
しかし、描画の順序を変更すると、機能しなくなります。マスクを無視します。
期待される結果の写真: