Я закодировал 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)
Кажется правильным, если двоичные представления совпадают.
Кажется чтобы вернуть переполненные значения, трудно сказать, с единственным способом отладки, сравнивающим изображения, но это, конечно, не то, что я ожидаю, что он выведет.