【问题标题】:Load single byte to texture in LWJGL/LibGDX在 LWJGL/LibGDX 中加载单个字节到纹理
【发布时间】: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。这部分对我来说确实有意义。

标签: libgdx lwjgl


【解决方案1】:

我正在使用 buffer.write((byte)(integer number & 0xff)) 按照 cmets 的建议写入我的字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2021-02-04
    相关资源
    最近更新 更多