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 を検出するために、ステンシル バッファを使用する以外の方法があるかどうかを提案できますか?