2012-01-30 8 views
4

のAndroidのOpenGL ES 1.1(HTCの欲望)を使用して...私は、一般的に持っているのAndroidのOpenGL ES 1.1:ステンシルバッファから読み出さ

問題はこれです:

私は複雑でレンダリングされた様々な3Dオブジェクトを持っていますシーン。ユーザーが特定のオブジェクトをクリックしたかどうかを確認したいこのオブジェクトは部分的に隠されている可能性があり、そのためシーン内のほぼすべての図形として表示されることがあります。私は、ユーザーがシーン内で見えるオブジェクトの一部をクリックすると、オブジェクトが「選択」されるようにしたいだけです。これは、オブジェクトの隠れた領域を簡単に考慮できないため、オブジェクトの交差に対してベクトルベースの計算を使用できないことを意味します。

だから、私は、オブジェクトが表示されていた場所にステンシルバッファが1秒で満たされていたようなステンシルバッファを設定し、他の場所のステンシルバッファにすると0です...アイデアを

を思いつきましたユーザはシーン内の特定のピクセルをクリックします。オブジェクトがクリックされたかどうかを示す1または0が含まれているかどうかを確認するためにステンシルバッファをチェックするだけです。

これはPC上では完全に機能しますが、Android OpenGL ES 1.1ではGL_STENCIL_INDEXがサポートされていないため、glReadPixels()を使用してステンシルバッファから読み込むことができないようです。

この0/1をステンシルバッファから読み取る方法があるかどうかは知っていますか?または、誰かが私のオブジェクトがクリックされたかどうかを判断するためのより良いアルゴリズムを考えることができますか?

多くのありがとう

答えて

1

カラーバッファを使用して同じアルゴリズムを実装できます。

FrameBufferを作成します。シーンをレンダリングしますが、各オブジェクトを個別の色で描画します。フレームバッファに描画するものは、目ではなく、マウスのルックアップのためだけであるため、色はオブジェクトの実際の色と同じである必要はありません。シーン全体を描画したら、glReadPixelsを使用してピクセルを読み取ります。マウスイベントからマウスの座標を取得したら、それらをピクセルマップで探します。見つけた色は、マウスが現在持っているオブジェクトに戻ることができます。

ステンシルバッファを使用する方が効率的ですが、ステンシルバッファをメモリに読み込むことは、OpenGL ESでは不可能と思われます。一方、この方法の利点は、8ビットのステンシルバッファの場合のように255個のオブジェクトに限定されないことです。

+0

レンダバッファ添付ファイルのテクスチャに8ビットカラー値の既定のサポートがないため(glReadPixel値はそれに応じて拡大縮小する必要があります)、上記の方法では少しの精巧さが必要です。他の落とし穴には、glEnabledディザリングと(しかし、これは野生のhypoteysです)、おそらくハードウェアベンダーからいくつかの実装が奇抜です(例えば、いくつかのビデオハードウェアはラスタライズ時にあまり正確ではないかもしれません)。もう少し遅いですが、他の人が私のようにこの答えを調べるかもしれません。 – Rick77