1

私が読んだopenglピッキングシステムを実装しようとしていますが、glReadPixelsで問題が発生しました。基本的に、シーン内のすべてのノードは一意の色を取得し、新しいタッチが発生すると、一意の色 ID でペイントされたノードだけでシーンをレンダリングします。保存されたカラーIDのリストで入力座標をチェックしようとしています。

glReadPixels を正しく動作させることができません。ピクセル値に対して常に 0 0 0 を返します。そこから正しいピクセル値を取得するための助けをいただければ幸いです。ありがとう

ここに関連するコードがあります

private void handleEvent(MotionEvent event) {
    int x = (int) event.getX();
    int y = (int) event.getY();
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    if (actionCode == 0) {
        // Paint with colorID color
        mSettings.picking(true);
        dumpEvent(event);
        final GL10 gl = mSettings.getGL();

        ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4);
        PixelBuffer.order(ByteOrder.nativeOrder());
        gl. glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1);
        gl.glReadPixels(x, y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, PixelBuffer);
        byte b[] = new byte[4];
        PixelBuffer.get(b);
        String key = "" + b[0] + b[1] + b[2];       
        // Check for selection
        mRenderer.processSelection(event, new SGColorI(pixel[0], pixel[1], pixel[2], pixel[3]));

        log.pl("GL on touchdown", key);
    } else if (actionCode == 2) {
        mSettings.picking(false);
    }
}
4

2 に答える 2

1

allocateDirectこの場合は「うまくいきません」。を使用しallocateます。

私には非常に奇妙に思えましたが、割り当て vsallocateDirectが唯一の違いでした。

また、Googleグループのこの投稿は私を大いに助けてくれました.

ところで、この発見は、実際のデバイスではなく、エミュレーター (いくつかの異なるバージョン) で行われました。

于 2012-03-19T01:50:23.423 に答える
0

古典的な選択問題に対する glReadPixels の使用はやり過ぎです。glReadPixels はブロッキング関数であるのに対し、openGL は主に非同期で動作することに注意してください。glReadPixels を使用すると、ドライバー キュー内のすべてのコマンドを処理する必要があり、これは膨大な時間の無駄になる可能性があります。

于 2013-11-13T16:35:20.417 に答える