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

时间:2015-12-04 05:55:58

标签: 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 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 0),但是当我将整个屏幕渲染为红色时,我才会回来(255 0 0)。 p>

1 个答案:

答案 0 :(得分:0)

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

这不要与用于顶点坐标的NDC(标准化设备坐标)系统相混淆,顶点坐标的原点位于窗口的中心,并且在x-的范围内都有[-1.0,1.0]的范围。和y方向。

所以在你的例子中:

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);

其中widthheight是渲染表面的尺寸,以像素为单位。