【问题标题】:Reading Buffers in Java在 Java 中读取缓冲区
【发布时间】:2011-10-25 15:14:58
【问题描述】:

我需要一些手来读取由 android 的 opengl-es api 中的 glReadPixels 功能吐出的缓冲区。到目前为止,这是我的代码...

public static void pick(GL11 gl){
        int[] viewport = new int[4];
        IntBuffer pixel = IntBuffer.allocate(384000);

        mColourR = BaseObject.getColourR();
        mColourG = BaseObject.getColourG();
        mColourB = BaseObject.getColourB();

        x = MGLSurfaceView.X();
        y = MGLSurfaceView.Y();

        gl.glGetIntegerv(GL11.GL_VIEWPORT,viewport,0);

        gl.glReadPixels((int)x,viewport[3]-(int)y, 1, 1, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixel);


}

此代码中输出缓冲区的名称是“像素”,我需要在此代码中添加什么才能从“像素”缓冲区取回颜色值。

【问题讨论】:

    标签: java android opengl-es colors buffer


    【解决方案1】:

    您可以使用IntBuffer 中的get() methods 之一来访问各个值。

    RGB 颜色值通常以这种顺序存储,因此调用pixel.get(0) 会得到第一个像素的红色值,pixel.get(1) 会得到绿色通道,依此类推。通常,这些值是按行存储的。

    因此,如果您需要特定像素 (x,y) 的值,则必须调用 get(screenWidth*3*y + x)

    顺便说一句,您可以通过调用 pixels.array() 从您的 IntBuffer 检索原始 int 数组

    【讨论】:

    • 嗯,似乎没有做到这一点,我的日志标签显示这些值总是返回黑色 (0, 0, 0)
    • 我认为在这种情况下问题不在于检索值。这个很直截了当。也许您可以通过使 Buffer 成为 ByteBuffer 来对齐像素类型,以便对应于 readPixels 调用的 GL11.GL_UNSIGNED_BYTE?这是一个疯狂的猜测。
    • 不,没有这样做,我的视口显示了正确的值不准确,实际上错过了我的对象坐标并选择了背景颜色,但什么也没有。嗯,我猜你已经回答了我的问题,所以
    • 很高兴您能澄清这个问题。干杯
    最近更新 更多