1

我正在使用 openGl 并找不到以下问题的解决方案。我正在使用带有 Ndk 的 openGl 并尝试从我的纹理生成像素的 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类型仍然是签名的,所以在调试器/日志/打印上,根据最左边(大端)位,该值将为空。我仍然不知道为什么这个位是 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");
4

1 回答 1

0

令人难以置信的答案,我检查了所有内存和 ndk 明智的,最后问题出在我的黑白着色器中。

解释: 之前的错误着色器取了最高的rgb值,并根据它设置了rg和b,这样我们就得到了黑色:

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

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

修复不是将 grayValue 放入 1,如果其值为 0,则将 0 放入 rg 和 b。

我希望它清楚。

于 2013-09-10T16:28:58.617 回答