Загрузить один байт в текстуру в LWJGL/LibGDX

У меня есть карта яркости в 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);

Это не приводит к значению 1.0 в GLSL/OpenGL, если я не ошибаюсь. Каков правильный способ получить значения в GLSL от 0 до 1,0, например, из целого числа в диапазоне от 0 до 255?


person RobotRock    schedule 18.06.2014    source источник
comment
byte в Java подписывается из диапазона [-128, 127]. 255 не входит в этот диапазон (на самом деле вам нужно -1), у вас будет чертовски много времени, чтобы заставить эту константу представлять 1,0. Вы можете рассмотреть преобразование в целое число: buffer.put ((byte)(255 & 0xff)); Это преобразует 255 в целое число, маскирует только младшие 8 бит, а затем приводит его обратно к byte. Тогда вам действительно не нужно заботиться о том, каков диапазон byte, потому что эта константа вместо этого обрабатывается как целое число со знаком; бит знака в целом числе со знаком находится далеко за пределами 8-битов младшего порядка, так что это помогает.   -  person Andon M. Coleman    schedule 19.06.2014
comment
На самом деле, если подумать, это должно применяться только к чтению беззнакового байта, а не к его записи.   -  person Andon M. Coleman    schedule 19.06.2014
comment
@ AndonM.Coleman AndonM.Coleman Разве вы не можете просто указать байт в шестнадцатеричном формате? buffer.put((byte)0xff); для 255. Я не проверял это, но это то, что я бы попробовал в первую очередь.   -  person Tenfour04    schedule 19.06.2014
comment
Ну, это страдает от той же проблемы, а именно 8-й бит является битом знака. Число 0xff на самом деле равно -1. Но так как здесь никто не интерпретирует значения, это действительно не имеет значения, мой разум работал в обратном направлении. Допустим, у вас есть байт без знака, полученный из OpenGL, а затем вы захотели самостоятельно выполнить преобразование с фиксированной запятой в с плавающей запятой, тогда факт значение 0xff интерпретируется как -1. Вот этого действительно нет.   -  person Andon M. Coleman    schedule 19.06.2014
comment
@ AndonM.Coleman Насколько я могу судить, ваш подход работает хорошо. Я еще не совсем понимаю, почему -128 представлен как 0x00 в конце битов, но это мое собственное невежество в этом вопросе. В любом случае я использую (byte)(integer & 0xff) и 0xff для 255/1.0 короче и 0x00 для 0/0.0 короче. Эта часть имеет смысл для меня.   -  person RobotRock    schedule 19.06.2014


Ответы (1)


Я использую buffer.write((byte)(integer number & 0xff)) для записи своих байтов в соответствии с рекомендациями в комментариях.

person RobotRock    schedule 19.06.2014