我对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");
答案 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。
我希望它清楚。