GLSL кодировка с плавающей точкой в ​​RGB (24 бит) - PullRequest
0 голосов
/ 25 октября 2019

Мой первый пост здесь, извините, если я нарушаю какие-либо нормы / правила. Итак, моя цель состоит в том, чтобы закодировать float (который находится в диапазоне 0-1) в RGB (24-битный) текстурный / кадровый буфер. (Я не могу использовать какой-либо другой формат из-за технических ограничений.)

Я нашел эту технику кодирования: http://marcodiiga.github.io/encoding-normalized-floats-to-rgba8-vectors

И, похоже, она работает довольно хорошо (по крайней мере, стабильно по сравнению сдругие схемы кодирования), но она распространяет информацию на 32 бита (RGBA). Я не могу понять, как переписать его так, чтобы он кодировал / декодировал в 24 бит (RGB). (Математика, стоящая за этим, вроде как приходит в голову. Я пытался удалить части формулы, например, уменьшив vec4s до vec3s, но, похоже, это искажает результаты из-за способа его кодирования, независимо от того, что я делаю. )

Было бы замечательно любое направление / подсказка в этом отношении.

vec4 packFloatToVec4i(const float value) {
  const vec4 bitSh = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);
  const vec4 bitMsk = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
  vec4 res = fract(value * bitSh);
  res -= res.xxyz * bitMsk;
  return res;
}

float unpackFloatFromVec4i(const vec4 value) {
  const vec4 bitSh = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);
  return(dot(value, bitSh));
}
...