【问题标题】:glReadPixels byte to floatglReadPixels 字节浮动
【发布时间】:2012-07-14 12:57:57
【问题描述】:

我正在尝试使用 glReadPixels 在 OpenGL ES 中检索颜色。我用 float[] 设置对象的颜色,例如{0.0f,0.5f,0.2f,1.0f} 如何将 glReadPixels 值转换为相同的 float[],因为它是无符号字节?

设置颜色:

gl.glColor4f(color[0], color[1], color[2], color[3]);

获取颜色:

ByteBuffer buf = ByteBuffer.allocate(4);
buf.order(ByteOrder.nativeOrder());

gl.glReadPixels((int) mx, height - (int) my, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, buf);
byte result[] = buff.array();

我不知道这是否已经被问过/回答过,但我还没有找到解决方案,我已经尝试了很长时间。

【问题讨论】:

  • 将每个颜色值存储在一个浮点数中,然后将其除以 255.0 即可。注意会有舍入误差。例如,您的.5 现在可能更像.498
  • @DavidSchwartz 如果我将颜色设置为 {1,0,0,0) 并将结果 [0] 除以 255.0,我得到 -0.003921569
  • @DavidSchwartz:有点复杂,请看这里:kaba.hilvi.org/programming/range/index.htm
  • @datenwolf 我不知道我应该如何使用这些信息。尝试在 Java 中实现该代码 sn-p,但效果不佳。没有更简单的方法吗?

标签: android opengl-es colors glreadpixels


【解决方案1】:

你得到byte / 255.f = -0.0039的原因是你从字节缓冲区得到的字节是java中的一个有符号值。

虽然 OpenGL 返回无符号值 255 = 0xFF,但 java 将其解释为有符号值,其中 0xFF = -1

将得到的字节 (result[0]) 转换为 int int resultInt = ((int)result[0]) & 0xFF,然后将其除以 255。你应该得到一个接近 1 的值。

【讨论】:

  • 谢谢!这正是我想要的!
【解决方案2】:

使用ByteBuffer.asFloatBuffer() 将其从字节转换为浮点数。

【讨论】:

  • 不,这不太行,或者我只是不知道如何处理它。然后我不能使用 FloatBuffer.array() 并且如果我使用 FloatBuffer.get() 它会返回一个类似于 -1.7014636e38 的值
  • 我不知道这应该有什么帮助。试过了,但现在它只返回零。
  • 这很奇怪。不久前我遇到了同样的问题,这似乎解决了它。对不起。
猜你喜欢
  • 2012-08-05
  • 2019-12-30
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多