2

これが私のピッキングコードです

public static void pick(GL11 gl){
        int[] viewport = new int[4];
        ByteBuffer pixel = ByteBuffer.allocateDirect(3).order(ByteOrder.nativeOrder());

        mColourR = BaseObject.getColourR();
        mColourG = BaseObject.getColourG();
        mColourB = BaseObject.getColourB();

        x = MGLSurfaceView.X();
        y = MGLSurfaceView.Y();

        gl.glGetIntegerv(GL11.GL_VIEWPORT,viewport,0);

        gl.glReadPixels((int)x, (int)(viewport[3] - y), 1, 1, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixel);
        Log.d(TAG, String.valueOf(gl.glGetError()));
        R = pixel.get(0);
        G = pixel.get(1);
        B = pixel.get(2);
        Log.d(TAG, "Colour:" + pixel.get(0) + " " + pixel.get(1) + " " + pixel.get(2));
        if (R == mColourR && G == mColourG && B == mColourB){
            match = true;

        }else{
            match = false;
        }
        Log.d(TAG, String.valueOf(match));
        Log.d(TAG, String.valueOf(viewport[0]) + "," + String.valueOf(viewport[1]) + "," + String.valueOf(viewport[2]) + "," + String.valueOf(viewport[3]));

} 

混乱して申し訳ありません。とにかく、このコードは、どこをクリックしても常に (0,0,0) を返すようです。テスト目的で赤い四角、緑、四角、青の背景があり、四角の1つが描画され、画面がそのように押されるたびに、このメソッドが呼び出されます

BaseObject.newColour();
    mColourR = BaseObject.getColourR();
    mColourG = BaseObject.getColourG();
    mColourB = BaseObject.getColourB();
    gl.glPushMatrix();
    gl.glColor4f(mColourR, mColourG, mColourB, 0.0f);
    gl.glTranslatef(x1, y1, 0);
    square.draw(gl);
    gl.glPopMatrix();
     ColourPicking.pick((GL11)gl);
    match = ColourPicking.getMatch();
    if (match == true){
        x1 = (float) Math.floor(Math.random()*9);
            y1 = (float) Math.floor(Math.random()*7);
        match = false;
    }

画面に黒いスペースはありませんが、常に黒い値が表示されるので、単なる精度の問題ではないと確信しています。そこにビューポートの値を返すログタグがあり、それらは問題ありません.xy座標も確認しましたが、1282エラーコードだけが正当であるようです。

誰かがこれが何であるか考えていますか?

編集:

関数の前後に glGetError() を配置したため、問題が読み取りピクセル関数から発生していることがわかります。

Before: 0
After: 1282

スケーリングを取り除くことは役に立たなかったが、それはロングショットだった

Buffer を FloatBuffer に変更したところ、(0, 0, 0) の代わりに (0.0, 0.0, 0.0) が返ってきました。また、エラーが 1280 (GL_INVALID_ENUM) になっていることにも気付きました。これが一歩前進かどうかはわかりません。エラー1282でない場合、このエラーを修正する方法を知っている人はいますか?

4

1 に答える 1

9

GL_INVALID_ENUM を取得しているときは、おそらく GL_RGB をフォーマット パラメータとして glReadPixels に渡しているためです。glReadPixelsの Khronos のドキュメントによると、形式と型の可能な値のペアは 2 つだけです。

  • GL_RGBA (形式) および GL_UNSIGNED_BYTE (型)
  • GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES および GL_IMPLEMENTATION_COLOR_READ_TYPE_OES の値。これらは、glGetIntegerv を使用してクエリできます。

最近同じ問題に遭遇しましたが、GL_RGBA を使用すると解決しました。

于 2011-10-27T20:29:10.947 に答える