2

カーソルの下にあるopenglオブジェクトを検出しようとしています...ピッキングと呼ばれるものを読みました。これが私のコードです:

public int makeBuffer(GL10 gl, int x, int y) {

    ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4);
    PixelBuffer.order(ByteOrder.nativeOrder());
    PixelBuffer.position(0);
    int mTemp = 0;
    gl.glReadPixels((int)x, (int) y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, PixelBuffer);
    Log.e("Picking", " xy: x" + x + " y"+ y);
    byte b [] = new byte[4];
    PixelBuffer.get(b);
    Log.e("Picking", " rgba: r"+ PixelBuffer.get(0) + " g" + PixelBuffer.get(1) + " b" +
            PixelBuffer.get(2) + " a" + PixelBuffer.get(3));
    Log.e("Picking", " rgba: r"+ b[0] + " g" + b[1] + " b" +
            b[2] + " a" + b[3]);

    //mTemp = PixelBuffer.get(0);
    mTemp = b[0];

    Log.e("Picking", "result:" + mTemp );

    return mTemp;
}

上記のコードのほとんどが logcat ステートメントであることを確認してください。私のコードは、r、g、および b の画面にゼロを出力します。アルファの場合、「フル アルファ」として 255 (符号なし) に変換可能な「-1」が出力されます。指定された x/y 位置で画面上の色を検出しようとしています。赤の値が 1 から 15 の間のどこかにあれば満足です。もし私が完全に間違ったやり方をしていたら、私はすべてゼロになるだろうと思っていましたが、アルファを取得しているので、少なくとも部分的に正しいやり方をしているに違いありません. マニフェストには、「サーフェス フリンガー」と「フレーム バッファーの読み取り」のアクセス許可を使用することを電話に伝える行も含めました。これらの行が機能しているかどうかはわかりません。

<uses-permission
android:name="android.permission.ACCESS_SURFACE_FLINGER" />
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" /

任意の助けをいただければ幸いです。

4

2 に答える 2

2

これらのアクセス許可は、署名アプリでのみ使用できます。Android ROM のコンパイル時に署名されたアプリ。したがって、通常のアプリでは何もしません。

android:name="android.permission.ACCESS_SURFACE_FLINGER"
android:name="android.permission.READ_FRAME_BUFFER" 
于 2012-09-05T13:34:53.977 に答える
2

AndroidでopenGL ESアプリを作成するときにも同様の問題に直面しました。

これまでの私の回避策は、アプリを RGB565 から RGBA8888 に変更することでした。レンダラーを設定する前に、次の行を挿入します。

getHolder().setFormat(PixelFormat.RGBA_8888);
setEGLConfigChooser(8, 8, 8, 8, 0, 0);

このソリューションは、RGBA8888 をサポートするデバイスでのみ機能することに注意してください。

于 2011-11-28T17:51:08.550 に答える