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 的零。对于 alpha,它打印“-1”,可转换为 255(无符号)作为“完整 alpha”。我试图在给定的 x/y 位置检测屏幕上的颜色。我会对介于 1 到 15 之间的红色值感到满意,因为这是应该低于触摸的颜色。我希望如果我做的完全错误,我会得到全零,但我必须至少部分正确,因为我正在获得 alpha。我还在清单中包含了一些行,告诉手机我使用“表面抛掷器”和“读取帧缓冲区”的权限。我不知道这些线路是否有效。

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

任何帮助,将不胜感激。

4

2 回答 2

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 回答
2

这些权限仅适用于签名应用程序。编译 Android ROM 时签名的应用程序。因此,它们对常规应用程序无能为力。

android:name="android.permission.ACCESS_SURFACE_FLINGER"
android:name="android.permission.READ_FRAME_BUFFER" 
于 2012-09-05T13:34:53.977 回答