4

Android OpenGL ES 1.1 (HTC Desire) を使用しています...

私が一般的に抱えている問題はこれです:

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

そこで、あるアイデアを思いつきました...

オブジェクトが表示されている場所はどこでもステンシル バッファーが 1 で満たされ、ステンシル バッファー内のそれ以外の場所はすべて 0 になるように、ステンシル バッファーを設定しました。ユーザーがシーン内の特定のピクセルをクリックすると、ステンシル バッファーをチェックして、オブジェクトがクリックされたかどうかを示す 1 または 0 が含まれているかどうかを確認します。

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

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

どうもありがとう

4

1 に答える 1

1

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

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

ステンシル バッファを使用する方が効率的かもしれませんが、OpenGL ES ではステンシル バッファをメモリに読み込むことはできないようです。一方、この方法の利点は、8 ビットのステンシル バッファーの場合のように 255 オブジェクトに制限されないことです。

于 2012-03-28T06:39:11.040 に答える