Я знаю, что это старый вопрос, но у меня была та же проблема, и я опубликую решение на случай, если кому-то понадобится это в будущем
float packColor(vec3 color) {
return color.r + color.g * 256.0 + color.b * 256.0 * 256.0;
}
vec3 unpackColor(float f) {
vec3 color;
color.b = floor(f / 256.0 / 256.0);
color.g = floor((f - color.b * 256.0 * 256.0) / 256.0);
color.r = floor(f - color.b * 256.0 * 256.0 - color.g * 256.0);
// now we have a vec3 with the 3 components in range [0..255]. Let's normalize it!
return color / 255.0;
}
Пока поплавок, упакованный с packColor, не являетсяв диапазоне [0, 1], но в диапазоне [0, 16777215] у вас не должно быть проблем с точностью.Но если вы нормализуете число с плавающей точкой в диапазоне [0,1], у вас возникнут проблемы с точностью!
Обратите внимание, что вы не можете хранить альфа (таким образом), так как плавающие числа highp являются 24-битнымидлинный, а не 32, как обычно используемые.В вершинном шейдере вы можете использовать этот код без проблем (точность по умолчанию - highp), но в фрагментном шейдере вы должны быть уверены, что используете только высокую точность!