2012-09-12 4 views
5

私は今、異なる色の他のポリゴンを描画する必要があり、画面上に複数の異なる色のポリゴンを描画したが、この多角形は、特定の色を有するこれらのピクセル上に描画されるべきです。特定のピクセルの色にのみポリゴンを描画する方法はありますか?

私は、自分の「層」で同時に異なる色のポリゴンのそれぞれをレンダリング(=一度に1色)。彼らはお互いをカバーすることができます。最新のレイヤはすべての以前のレイヤをカバーします。画像の黒い色は「ポリゴンなし」領域です。空白ですが、それも無視してください。

だから、基本的に私はちょうどポリゴンを描画した後、ポリゴンのN番目(最初ではない)層は、次のポリゴンレイヤでマスクされている必要があり、その下に他には何も影響を与えてはなりません。必要な方法の

画像:私は、OpenGLでこれを達成するために使用することができますどのような方法

enter image description here

?可能であれば、このためにシェーダ以外のソリューションを好むでしょう(?)。

現在私ができる唯一の方法は、各レイヤーを別々にメモリにレンダリングし、次に自分自身でピクセルを通過させてレイヤーを「手動で」結合することですが、それは非常に遅い方法のようですここではスピードが重要です。あなたは何ができるか、そのためにステンシルバッファを使用するには

答えて

4

は次のとおりです。

が、私はここでそれをカバーしていますので、これは、システムの特定のウィンドウ処理されて、あなたはステンシルバッファを持つコンテキストを要求していることを確認します。 glGet(GL_STENCIL_BITS)に電話して、十分なビット数を取得してください。

ステンシルバッファは、各ピクセルと一緒に整数を維持し、物事が描かれているとして、あなたがそれを変更することができます。各レイヤーを描画するときに、各レイヤーを描画するときに特定の値に設定するようにステンシルバッファを設定します。あなたは、各レイヤーを描くようあなたが今

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

でこれを行うと、画面に描かれた最後のポリゴンも、ステンシルバッファにそれの層数を格納します。あなたが戻ってあなたの緑の星を描きたいとき

この時点で、あなたはちょうどあなたが `GL_STENCIL_TEST`を有効なぜステンシルバッファはN.

//draw only where stencil == N 
glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_EQUAL, N, -1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
drawStar(); 
+0

に等しい画素に描くだけにそれを伝えます2番目のコードでのみ?私も最初のコードでそれを有効にするべきではない? – Rookie

+0

あなたは正しいかもしれません。もともと、STENCIL_TESTは、単にステンシルバッファに基づいて何かを拒否したいときだけ有効にしなければならないと思っていました。 glStencilOpコードを再読み込みすると、テストが無効になっているとステンシルバッファが変更されない可能性があります。ステンシル関数が常にパスするように設定されていることを考慮すると、最初の部分についてもステンシルテストを有効にできるはずです。 @ルーキー – Tim

+0

それをテストし、美しく動作します!私はそれが本当に両方のケースで有効にする必要があることをテストしました。 – Rookie

関連する問題