OpenGL: конвертировать RGBA в плавающий - PullRequest
0 голосов
/ 28 января 2020

Я закодировал float в текстуру (4 байта float32 сохраняются как значения RBGA). Теперь мне нужно декодировать их обратно в один раз.

Вот что я пробовал до сих пор, а что у меня не получилось:

    float rgbaToFloat(vec4 rgba) {
      uint r = uint(rgba.x*255.);
      uint g = uint(rgba.y*255.);
      uint b = uint(rgba.z*255.);
      uint a = uint(rgba.w*255.);

      return uintBitsToFloat((r << 24) | (g << 16) | (b << 8) | a);
    }

Я упаковываю плавающие объекты в изображение текстуры, используя следующий фрагмент (python):

import numpy as np

data_flat = [...]  #floats

dim = int(np.sqrt(len(data_flat))) + 1
image = np.zeros((dim, dim, 4), dtype='uint8')
for i, d in enumerate(data_flat):
    image[i // dim, i % dim] = np.array([d], dtype=np.float32).view(np.uint8)

Для одного значения с плавающей запятой он выдает следующий вывод:

d = 0.06797099858522415;
np.array([d], dtype=np.float32).view(np.uint8)
>>> array([ 97,  52, 139,  61], dtype=uint8)

Кажется правильным, если двоичные представления совпадают.

Кажется чтобы вернуть переполненные значения, трудно сказать, с единственным способом отладки, сравнивающим изображения, но это, конечно, не то, что я ожидаю, что он выведет.

1 Ответ

0 голосов
/ 29 января 2020

Спасибо @ LJ ᛃ за ссылку на этот ответ , это работает как шарм.

...