4

描画/ペイント メカニックが関与する iPhone 用のゲームに取り組んでおり、既にペイントされたものを消去するツールを作成しようとして問題が発生しています。

主な問題は、ペイントされている背景が単色ではなく、静止画像またはアニメーションであることです。描画でさまざまなブレンド オプションと論理演算を使用してみましたが、何も機能していないようです。私は OpenGL を初めて使用するので、何か不足しているに違いありません。

任意のヒント?

編集: もう少し情報を提供するために、ブラシにテクスチャを使用し、glVertexPointer() と glDrawArrays() を使用してそれらをレンダリングしています。例えば:

glBindTexture(GL_TEXTURE_2D, circleBrush);
glVertexPointer(3, GL_FLOAT, 0, verts);
glTexCoordPointer(2, GL_FLOAT, 0, coords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

編集 2: 残念ながら、ステンシル バッファは iPhone では利用できません。: (

編集 3: Framebuffer オブジェクトは iPhone で利用でき、それが私が取った道です。まだ完全には実装していませんが、これまでのところ、希望どおりに機能しているようです。みんな、ありがとう!

4

5 に答える 5

5

シーン上にフルスクリーンのテクスチャ クワッドを描画します。ユーザーがブラシ ストロークを描画するときに、glTexSubImage2Dテクスチャを更新するために使用します。

glReadPixels/glDrawPixels は遅いです。

FrameBufferObjects を使用するとさらに良いのですが、この拡張機能が iPhone で利用できるとは思えません (確かなことはわかりませんので、試してみてください)。FBO を使用すると、別のレンダリング コンテキストであるかのように、テクスチャに直接描画できます。

于 2008-11-18T16:24:46.933 に答える
2

多くの情報は提供しませんが、「ペイント」したものをすべてバッファに保存し、次のように画面に描画していると思います。

 glWindowPos2i(X, Y);
 glDrawPixels(drawing->Width, drawing->Height, drawing->Format, 
              GL_UNSIGNED_BYTE, drawing->ImageData);

drawing->ImageData がバッファです。できることは、別のバックグラウンド バッファーを用意して、最初に描画することです。次に、消去ツールは描画バッファーを単純に白くします (アルファを含むすべての値を上に上げます)。

このソリューションを機能させるには、ブレンディングをオンにして深度テストをオフにする必要があります。

 glEnable(GL_BLEND);
 glDisable(GL_DEPTH_TEST);
 glWindowPos2i(X, Y);
 //background never changes
 glDrawPixels(background->Width, background->Height, background->Format, 
              GL_UNSIGNED_BYTE, background->ImageData);
 glWindowPos2i(X, Y);
 glDrawPixels(drawing->Width, drawing->Height, drawing->Format, 
              GL_UNSIGNED_BYTE, drawing->ImageData);
 glEnable(GL_DEPTH_TEST);
 glDisable(GL_BLEND);

それはあなたが探しているものですか?

于 2008-11-15T04:16:10.867 に答える
2

この操作にはステンシル バッファーを使用できます。ステンシル バッファーは、深度バッファーと同様に、すべてのピクセルの情報を保持する特別なバッファーです。深度バッファーとは異なり、描画中にステンシル バッファーがどのように変更されるか、およびそれがカラー バッファーに描画するかどうかの決定にどのように影響するかを決定します。そのために、描画操作の前に特定の状態を設定できます。これがあなたがすることです:

  • ユーザーが消去するときに、「消去された」領域をステンシル バッファーに描画します (StencilOp を使用、以下を参照)。そのためには、任意の GL 描画関数を使用できます。

  • すべてのレンダリング パスで、最初に背景を描画します (必要に応じて、ここでネガティブ ステンシル テストを使用して、背景の「消去された」部分のみを描画できます。パフォーマンスが向上する場合があります)。

  • 次に、他のすべての描画操作に対してステンシル テストを有効にします。OpenGL は、「消去されていない」領域にのみ描画します。

ステンシル バッファが描画にどのように影響するか (または影響しないか) を設定する関数: glStencilFunc()

ステンシル バッファ自体が描画によってどのように影響を受けるかを設定する関数: glStencilOp()

これらの引数も含む詳細な説明: http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

于 2008-11-16T07:15:50.083 に答える
1

glBlendFunc(GL_ONE, GL_ZERO) モードを使用すると耳が聞こえます。

于 2010-07-04T07:06:30.303 に答える