Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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 OpenGL读取屏幕中央的像素颜色_Android_Opengl Es - Fatal编程技术网

Android OpenGL读取屏幕中央的像素颜色

Android OpenGL读取屏幕中央的像素颜色,android,opengl-es,Android,Opengl Es,我正在OpenGL中渲染纹理。我想检索屏幕中心的像素颜色值 ByteBuffer byteBuffer = ByteBuffer.allocate(4); byteBuffer.order(ByteOrder.nativeOrder()); GLES20.glFinish(); GLES20.glReadPixels(0, 0, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer); byte[] byteArray = new b

我正在OpenGL中渲染纹理。我想检索屏幕中心的像素颜色值

ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.order(ByteOrder.nativeOrder());
GLES20.glFinish();
GLES20.glReadPixels(0, 0, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer);
byte[] byteArray = new byte[4];
byteBuffer.get(byteArray);
int r = ((int) byteArray[0]) & 0xFF;
int g = ((int) byteArray[1]) & 0xFF;
int b = ((int) byteArray[2]) & 0xFF;
String key = r + " " + g + " " + b;
Log.i(TAG, key);

作为测试,我正在将一个红方块渲染到屏幕中心,并希望记录(255 0),但只有在将整个屏幕渲染为红色时,我才会返回(255 0)。

传递到
glReadPixels()
的坐标/大小在窗口坐标中。窗口坐标系的原点位于窗口的左下角,以像素为单位

这不能与用于顶点坐标的NDC(标准化设备坐标)系统混淆,该系统的原点位于窗口的中心,在x和y方向上的范围为[-1.0,1.0]

在你的例子中:

GLES20.glReadPixels(0, 0, 1, 1,
    GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer);
您正在读取渲染曲面左下角的一个像素。要读取中心的像素,您需要:

GLES20.glReadPixels(width / 2, height / 2, 1, 1,
    GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer);

其中,
width
height
是以像素为单位的渲染曲面的尺寸。

如果读取左下角的像素,为什么希望得到中心?GLES20.glReadPixels()是否使用OpenGL坐标系?(0,0)是OpenGL中屏幕的中心。