openGl glReadPixels返回不正确的值

时间:2013-09-10 12:52:24

标签: android byte opengl-es-2.0 bytebuffer

我对openGl感到困扰,无法找到解决以下问题的方法。 我正在使用openGl与Ndk并尝试从我的纹理生成像素的ByteBuffer并将其发送到本机c。

纹理图像是黑白图像,意思是按字节顺序:

黑色:预期结果 - 0(R)0(G)0(B)1(A) - 0001

白色:预期结果 - 1(R)1(G)1(B)1(A) - 1111

这个标志与此无关,因此两个数字都是正数。

这是事实,因为在Java中,原语的状态始终是有符号的。

并发症:我们正在获取无符号字节的缓冲区 所以期望是:

黑色:0(R)0(G)0(B)1(A) - 0001保持不变,因为每个字节的左位为0。

白色:1(R)1(G)1(B)1(A) - 位符号始终打开(表示负数),所以-127,-127,-127,-127

但是,我得到的奇怪输出是:-10 -10 -10 -1(RGBA), - 10 -10 -10 -1,-10 -10 -10 -1,-10 -10 -10 -1

如果我要求无符号字节,为什么会有符号? 编辑: 部分解释是java类型仍然是有符号的,因此在调试器/ logs /打印时,取决于最左边(大端)位,该值将为null。我仍然不知道为什么这个位是1。

为什么值为-10和-1?至少alpha字节应始终为1.

我将ByteBuffer设置如下:

int[] frame = new int[1];
    GLES20.glGenFramebuffers(1, frame, 0);
    RendererUtils.checkGlError("glGenFramebuffers");
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frame[0]);
    RendererUtils.checkGlError("glBindFramebuffer");
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, texture, 0);
    RendererUtils.checkGlError("glFramebufferTexture2D");


    ByteBuffer buffer = ByteBuffer.allocate(width * height * 4);
    //GLES20.glPixelStorei(pname, param);
    GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, arrayNativeType, buffer); // todo take unsigned int

    RendererUtils.checkGlError("glReadPixels");

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
    RendererUtils.checkGlError("glBindFramebuffer");
    GLES20.glDeleteFramebuffers(1, new int[]{0}, 0);
    RendererUtils.checkGlError("glDeleteFramebuffer");

1 个答案:

答案 0 :(得分:0)

不可思议的答案,我检查了所有内存和ndk明智,最后问题出现在我的黑白照片中。

说明:以前的错误着色器获得了最高的rgb值并根据它设置了r g和b,这样我们得到了黑色:

float greyValue = max(fragColor.r, max(fragColor.g, fragColor.b));
gl_FragColor = vec4(greyValue, greyValue, greyValue, 1.0);

错误是我不知道精确的颜色及其字节表示。

修复代替greyValue而不是1,如果它的值为0,则为0和r为b。

我希望它清楚。