0

OpenGL ピッキングを実行しようとしています (つまり、「ユーザーがクリックしたオブジェクトはどれですか?」という質問に答えます)。私はそれをグーグルで検索し、いくつかの異なるテクニックを見つけましたが、どれも私にとっては問題ありません

  • glReadPixels でピクセルの色をチェック: テクスチャを使用しているため、適切ではありません
  • glReadPixels でピクセル アルファをチェック: ブレンドにアルファを使用しているため、適切ではありません
  • 光線の構築と衝突のチェック: ああ!、それには立ち入らないほうがいいと思います...
  • glRenderMode(GL_SELECT): OpenGL ES ではサポートされていません

ステンシル バッファの値を確認することを考えています。通常の目的には使用しないので、各オブジェクトがその ID を書き込むことができます (オブジェクトの数は 255 未満です)。問題は、glReadPixels を使用してステンシル バッファー値を読み取ることができないことです。RGBA では問題ありませんが、Stencil 値で機能させることができません。これが私のコードです:

ByteBuffer bb = ByteBuffer.allocateDirect(4); 
bb.order(ByteOrder.nativeOrder()); 
bb.position(0); 
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, bb); 
Log.d(TAG, "color is R"+ bb.get() + " G" + bb.get() + " B" + 
    bb.get() + " A" + bb.get()); 
// ---> This is working fine, I can read RGBA correctly 
bb.position(0); 
glReadPixels(x, y, 1, 1, GL11ExtensionPack.GL_STENCIL_INDEX, 
GL_UNSIGNED_BYTE, bb); 
    Log.d(TAG, "stencil is "+ bb.get()); 
    // ---> This is not working, looks like it isn't doing anything 

私はまだバッファにR値を取得しているので...

ステンシル バッファをクリッピングに使用できたので、ステンシル バッファが稼働していることは確かです。setEGLConfigChooser(8, 8, 8, 8, 8, 8) を使用して 8 ビットに構成されます。

それはプラットフォームの制限ですか、それとも私のやり方が間違っているのでしょうか? (ステンシルバッファを読み取る実際の例は見つかりませんでした)

また、ユーザーがクリックしたオブジェクト ID を検出するために、ステンシル バッファを使用する以外の方法があるかどうかを提案できますか?

4

2 に答える 2

3

実際にレイをシーンにキャストし、衝突をチェックすることが、ピッキングに最適な方法です。

glReadPixels アプローチを使用する場合は、バッファーをスワップせずに、オブジェクトをバック バッファーにレンダリングするだけです (オブジェクトの ID は一定の色としてエンコードされます)。オブジェクトを表示用に完全にテクスチャ化してレンダリングすることもできます。ユーザーがクリックしたとき (およびシーンが実際に変更されたとき) にのみオブジェクトの色でレンダリングし、それらを表示せずにバック バッファーにのみレンダリングします。

于 2011-05-20T14:00:17.430 に答える
0

glReadPixels でピクセルの色をチェック: テクスチャを使用しているため、適切ではありません

なぜこれが機能しないのですか?glReadPixelsを使用して、メディア ソースがカメラまたはビデオ ファイルからのものであるかどうかにかかわらず、 SurfaceTextureピクセルの色を読み取ることができます。

GLSurfaceView を使用してすべてのビデオ フレームを単一の画像ファイルにダンプしようとするMediaDumpプロジェクトを確認してください。それを変更してさらに処理を行うか、ソースをカメラに変更することができます。どちらも実行可能です。ただし、 setEGLConfigChooserの RGBA サイズ設定に注意してください。ピクセルの読み取り速度に影響します。

于 2013-06-15T19:10:11.633 に答える