Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android上使用glreadpixels——通常为零_Android_Opengl Es_Glreadpixels - Fatal编程技术网

如何在android上使用glreadpixels——通常为零

如何在android上使用glreadpixels——通常为零,android,opengl-es,glreadpixels,Android,Opengl Es,Glreadpixels,我正在尝试检测光标下的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

我正在尝试检测光标下的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之间,因为这是 应该在触摸之下。如果我这样做的话,我会期待的 完全错了,我会得到所有的零,但至少我必须这样做 部分正确,因为我得到了阿尔法。我还将行包括在 我的清单告诉电话我使用了 “surface flinger”和“读取帧缓冲区”。我不知道这些 线路正常

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


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

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

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

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

这些权限仅适用于签名应用程序。编译Android ROM时签名的应用程序。所以他们对普通的应用程序什么也不做

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

我相信我的问题在于我将错误的y值传递给了函数。事实证明,opengl期望值从底部开始增加,而android提供的值从顶部开始增加。那么……这真的有效吗?它只是Y型反转,你得到的是像素颜色?嗨!我这里有同样的问题:。看起来我和你做的一样,但是我一直得到红色的-1值(而不是128-130之间的数字)。如果你能来看看我的代码,我会非常感激。我看不出有什么不同,你说现在你已经开始工作了。提前谢谢!我不知道第一行是干什么的。但是setEGLConfigChooser(8,8,8,8,0,0);对我来说已经足够解决这个问题了。
setEGLConfigChooser(8,8,8,16,0);getHolder().setFormat(PixelFormat.RGBA_8888)我在GLSurfaceView的构造函数中使用了这两行。据我所知,这可以确保GL上下文和视图曲面对像素使用相同的表示(RGB888而不是默认的RGB565)。如果两者不相同,您将注意到绘制的值和从glreadpixels读取的值之间的微小差异。还需要注意的是,setEGLConfigChoose会根据您的请求选择最接近的配置。实际配置将取决于您的硬件。