5

画面に複数の異なる色のポリゴンを描画しましたが、別の色の別のポリゴンを描画する必要がありますが、このポリゴンは特定の色を持つピクセルにのみ描画する必要があります。

異なる色のポリゴンをそれぞれ独自の「レイヤー」で同時にレンダリングします (= 一度に 1 つの色)。それらは互いにカバーできます。最新のレイヤーは、以前のすべてのレイヤーをカバーします。画像の黒い色は「ポリゴンがない」領域、つまり空きスペースであり、それも無視する必要があります。

したがって、基本的にはポリゴンをレンダリングするだけで、ポリゴンの N 番目 (最初ではない) のレイヤーを次のポリゴン レイヤーでマスクする必要があり、その下にある他のレイヤーは影響を受けません。

必要な方法のイメージ:

ここに画像の説明を入力

OpenGL でこれを実現するには、どのような方法を使用できますか? 可能であれば、これにはシェーダー以外のソリューションを使用したいと思います(?)。

現在私ができる唯一の方法は、各レイヤーを別々にメモリにレンダリングし、自分でピクセルを調べてレイヤーを「手動で」結合することですが、それは非常に遅い方法のように思えますが、実行可能ですが、速度は重要ですここ。

4

1 に答える 1

4

これにステンシル バッファを使用するには、次のようにします。

ステンシル バッファーを含むコンテキストを要求するようにしてください。これはウィンドウ システム固有であるため、ここでは説明しません。を呼び出しglGet(GL_STENCIL_BITS)て、十分な数のビットを取得することを確認してください。

ステンシル バッファーは、各ピクセルと共に整数を保持し、描画時にそれを変更できるようにします。各レイヤーを描画するときに、ステンシル バッファーを設定して、各レイヤーを描画するときに特定の値を設定します。あなたはこれを行います

 //draw layer N
 glEnable(GL_STENCIL_TEST);
 glStencilFunc(GL_ALWAYS, N, -1); 
 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

各レイヤーを描画すると、画面に最後に描画されたポリゴンも、そのレイヤー番号をステンシル バッファーに格納します。

この時点で、戻って緑色の星を描画したい場合は、ステンシル バッファーが N に等しいピクセルのみを描画するように指示するだけです。

 //draw only where stencil == N
 glEnable(GL_STENCIL_TEST);
 glStencilFunc(GL_EQUAL, N, -1);
 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
 drawStar();
于 2012-09-12T15:11:39.883 に答える