【问题标题】:how to use glreadpixels with android -- usually get zeros如何在 android 中使用 glreadpixels——通常是零
【发布时间】:2011-10-11 17:59:24
【问题描述】:

我正在尝试检测光标下的 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 之间,因为那是 应该在触摸之下。我希望如果我这样做 完全错误我会得到全零,但我至少必须这样做 部分正确,因为我正在获得阿尔法。我还在 我的清单告诉手机我使用权限 “表面抛掷器”和“读取帧缓冲区”。不知道这些是不是 线路正常。

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

任何帮助将不胜感激。

【问题讨论】:

  • 我相信我的问题是我将错误的 y 值传递给函数。事实证明,opengl 期望值从底部增加,而 android 提供从顶部增加的值。
  • 所以...这真的有效吗?它只是 Y 反转,你得到的是像素颜色?
  • 嗨!我在这里有同样的问题:stackoverflow.com/questions/7488197/…。似乎我和你做的一样,但我一直得到红色的 -1 值(而不是 128-130 之间的数字)如果你能通过那个线程来看看我的代码,我将不胜感激。我看不出有什么区别,你说现在你可以正常工作了。提前致谢!

标签: android opengl-es glreadpixels


【解决方案1】:

在 android 上创建 openGL ES 应用时,我也遇到了类似的问题。

到目前为止,我的解决方法是将应用程序从 RGB565 更改为 RGBA8888。在设置渲染器之前插入这些行:

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

您必须知道,此解决方案仅适用于支持 RGBA8888 的设备。

【讨论】:

  • 我不确定第一行是干什么用的。但是 setEGLConfigChooser(8, 8, 8, 8, 0, 0);足以为我解决这个问题。
  • setEGLConfigChooser(8, 8, 8, 8, 16, 0); getHolder().setFormat(PixelFormat.RGBA_8888);
  • 我在 GLSurfaceView 的构造函数中使用了这两行。据我了解,这可确保您的 GL 上下文和视图表面对像素使用相同的表示(RGB8888 而不是 RGB565,这是默认值)。如果两者不相同,您会注意到绘制的值和从 glreadpixels 读取的值存在细微差别。同样重要的是要注意 setEGLConfigChoose 会尝试根据您的请求选择最近似的配置。实际配置将取决于您的硬件。
【解决方案2】:

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

android:name="android.permission.ACCESS_SURFACE_FLINGER"
android:name="android.permission.READ_FRAME_BUFFER" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多