Заредете един байт към текстура в 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 Не можете ли просто да посочите байта в шестнадесетичен? 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