В случае объединения двух изображений PNG, одного с 8 старшими битами и второго с 8 младшими битами, я думаю, что это должно быть:
highp vec4 texCol = texture2D(tex_low, vec2(vTexCoord.s, vTexCoord.t)) * (1.0 / 257.0);
texCol += texture2D(tex_up, vec2(vTexCoord.s, vTexCoord.t)) * (256.0 / 257.0);
В 8 битах на канал цвета RGB будут варьироваться от 0 до 255 = 2 ^ 8 - 1.
В 16 битах на канал цвета RGB будут варьироваться от 0 до 65535 = 2 ^ 16 - 1 = 255 * 257.
Объяснение
WebGL работает с использованием значений цвета от 0 до 1 и делает это путем деления 8-битного значения цвета на 255. Таким образом, разделенное значение принадлежит диапазону <0,1>.
В случае 16 бит на канал мы хотели бы разделить его на 65535, чтобы получить правильное число из диапазона <0,1>.
Нам нужно 16-битное значение цвета, уменьшенное до диапазона <0,1>.
Пусть low
и up
будут значениями цвета из диапазона 0..255. up
- это старшие 8 бит, а low
- младшие 8 бит.
Чтобы получить 16-битное значение, мы можем вычислить: low + up*256
. Теперь у нас есть номер в диапазоне 0..65535. Чтобы получить значение из диапазона <0,1>, мы делим его на 65535. Обратите внимание, что WebGL работает с использованием значений цвета из диапазона <0,1>, это Lw=low/255
и Uw=up/255
. Таким образом, нам не нужно умножать его на 255 и делить на 65535, потому что 65535 = 255 * 257. Вместо этого мы просто делим на 257.
Также я не смог найти никакого программного обеспечения для разделения 16-битного / канального изображения на два 8-битных / канальных изображения, так что вот мой код, не стесняйтесь его использовать, он разбивает 16-битный / канальный Tiff на два 8-битных / канальных PNGs:
https://github.com/czero69/ImageSplitter