Я пытаюсь изучить теневое отображение в WebGL. Я вижу тот же фрагмент кода шейдера, который копируется в различных библиотеках и примерах, которые достигают этого. Однако нигде я не нашел объяснения, как это работает.
Идея состоит в том, чтобы сохранить значение глубины (один поплавок) в цветовой буфер (vec4). Существует функция пакета, которая сохраняет float в vec4 и распаковывает функцию, которая извлекает float из vec4.
vec4 pack_depth(const in float depth)
{
const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);
const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
vec4 res = fract(depth * bit_shift);
res -= res.xxyz * bit_mask;
return res;
}
float unpack_depth(const in vec4 rgba_depth)
{
const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);
float depth = dot(rgba_depth, bit_shift);
return depth;
}
Я бы предположил, что упаковка float в vec4 должна быть тривиальной проблемой, просто скопируйте ее в один из 4 слотов vec4 и оставите других неиспользованными. Вот почему логика смещения битов в вышеприведенном коде меня озадачивает.
Может ли кто-нибудь пролить свет?