【发布时间】:2014-06-19 18:36:25
【问题描述】:
我在 LibGDX 中有一张亮度图。我使用 ByteBuffer 来加载我的像素,效果很好。
Gdx.graphics.getGL20().glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 1);
Gdx.graphics.getGL20().glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_LUMINANCE, overviewBlock.getWidth(), overviewBlock.getHeight(), 0,
GL20.GL_LUMINANCE,
GL20.GL_UNSIGNED_BYTE, overviewBuffer);
但是,我无法理解 GLSL 中字节是如何转换为浮点数的。对于基于整数的颜色,写入 ByteBuffer 就像一个魅力。但我不确定如何使用单字节颜色来做到这一点。
buffer.put((byte)255);
如果我没记错的话,这不会导致 GLSL/OpenGL 中的值为 1.0。在 GLSL 中获取 0 到 1.0 之间的值(例如从 0 到 255 之间的整数)的正确方法是什么?
【问题讨论】:
-
Java 中的
byte在 [-128, 127] 范围内签名。 255 不在该范围内(-1 实际上是您所需要的),您将有一段时间让该常数表示 1.0乙>。您可能会考虑提升为整数:buffer.put ((byte)(255 & 0xff));将 255 提升为整数,仅屏蔽低 8 位,然后将其转换回byte。那么您真的不必关心byte的范围是多少,因为该常量被视为有符号整数;有符号整数中的符号位远远超出最低 8 位,所以这会有所帮助。 -
实际上,想想看,这应该只适用于读取一个“无符号”字节,而不是写入一个。跨度>
-
@AndonM.Coleman 你不能只用十六进制指定字节吗?
buffer.put((byte)0xff);为 255。我还没有测试过,但这是我首先要尝试的。 -
好吧,这也有同样的问题——即第 8 位是符号位。数字 0xff 实际上是 -1。但是由于没有人在这里解释价值,这真的无关紧要,我的想法是相反的。假设您有一个来自 OpenGL 的无符号字节,然后 您 想要自己进行定点 -> 浮点转换,那么 事实0xff 被解释为 -1 很重要。这里真的没有。
-
@AndonM.Coleman 据我所知,您的方法似乎效果很好。我还不太明白为什么 -128 在末尾表示为 0x00,但这是我自己对这个主题的无知。无论哪种方式,我都使用 (byte)(integer & 0xff) 和 0xff 简而言之 255/1.0 和 0x00 简而言之 0/0.0。这部分对我来说确实有意义。