テクスチャのセクションが描画されたときにそれらをマスクするための最良の方法を見つけようとしています。私の問題は、私がアルファマスクを実行したように見えるという事実にあります!
openGLを使用して、カスタムビルドの2Dゲームエンジンを描画しています。ゲームは、スプライトと単純なブロックテクスチャで構成されています。
私の望ましい結果は次のようになります。
- キャラクタースプライトが所定の位置に描画されます(単なるボックスではなく、アルファカラーを使用します)
- アイテムがプレイヤーの手に引き込まれます(ボックスではなく、アルファカラーを使用してシーンに引き込まれます)
- アイテムは、キャラクターの腕/手の後ろに表示されますが、体の残りの部分の上に表示されます。
今のところ、これを達成する方法を理解する唯一の方法は、それらを順番に(ボディ、アイテム、アーム)描画することですが、アートアセットを少し扱いやすくするために、これを避けたいと思います。私のアイデアの解決策は、キャラクターを描画してから、腕の「下」にあるはずのテクスチャの領域をブロックするアルファマスクを使用してアイテムを描画することです。
私が見た他の解決策はこのようなもので、glBlendFuncSeparate()関数が使用されています。私の現在のバージョンのOpenGLは拡張機能をサポートしていないため、拡張機能の導入を避けようとしています。私がその考えに反対していると言っているわけではありませんが、アルファマスクを描くためだけにそれを詰め込むのはちょっとした手間だと思いますか?
これは私にとって学習プロセスであることを完全に認めており、OpenGLがどのように処理されるかを実際に確認するための言い訳として使用しています。これを正しく描画するためにどこに向かうべきかについての提案はありますか?固定パイプラインのOpenGLがテクスチャを取得し、その上にアルファマスクを適用してから、それをバッファに描画する方法はありますか?キャラクターをあきらめて、モデルのいくつかの部分に分割する必要がありますか?
[更新:8/12/12]
Timが提案したコードを追加しようとしましたが、問題が発生しているようです。ステンシルバッファを有効にすると、必要なものだけでなく、すべてがブロックされます。これが私のテストサンプルコードです。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// Disable writing to any of the color fields
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
glStencilFunc(GL_ALWAYS, 0,0);
// Draw our blocking poly
glBegin(GL_POLYGON);
glVertex2f( 50, 50 );
glVertex2f( 50, 50+128 );
glVertex2f( 50+128, 50+128 );
glEnd();
glStencilFunc(GL_GREATER, 0, -1);
glEnable(GL_STENCIL_TEST);
// Re enable drawing of colors
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
// Enable use of textures
glEnable(GL_TEXTURE_2D);
// Bind desired texture for drawing
glBindTexture(GL_TEXTURE_2D,(&texture)[0]);
// Draw the box with colors
glBegin(GL_QUADS);
glTexCoord2d( 0, 0 ); glVertex2f( 50, 50 );
glTexCoord2d( 0, 1 ); glVertex2f( 50, 50+128 );
glTexCoord2d( 1, 1 ); glVertex2f( 50+128, 50+128 );
glTexCoord2d( 1, 0 ); glVertex2f( 50+128, 50 );
glEnd();
// Swap buffers and display!
SDL_GL_SwapBuffers();
明確にするために、このシステムをセットアップするための私のinitコードもここにあります。
ステンシルを無効にしてコードを実行すると、次のようになります。
glEnable(GL_STENCIL_TEST)を使用すると、次のようになります。
さまざまなオプションを試してみましたが、ステンシルバッファがすべてをブロックしている明確な理由がわかりません。
[更新#2 8/12/12]
動作するコードを取得しました。ありがとうございます。これが私が正しく動作するために実行することになったものです。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// Disable writing to any of the color fields
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glStencilOp(GL_INCR, GL_INCR, GL_INCR);
glEnable(GL_STENCIL_TEST);
// Draw our blocking poly
glBegin(GL_POLYGON);
glVertex2f( 50, 50 );
glVertex2f( 50, 50+128 );
glVertex2f( 50+128, 50+128 );
glEnd();
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
// Re enable drawing of colors
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
// Enable use of textures
glEnable(GL_TEXTURE_2D);
// Bind desired texture for drawing
glBindTexture(GL_TEXTURE_2D,(&texture)[0]);
// Draw the box with colors
glBegin(GL_QUADS);
glTexCoord2d( 0, 0 ); glVertex2f( 50, 50 );
glTexCoord2d( 0, 1 ); glVertex2f( 50, 50+128 );
glTexCoord2d( 1, 1 ); glVertex2f( 50+128, 50+128 );
glTexCoord2d( 1, 0 ); glVertex2f( 50+128, 50 );
glEnd();
glDisable(GL_STENCIL_TEST);
// Swap buffers and display!
SDL_GL_SwapBuffers();