我正在使用 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");