Я делаю некоторые вещи GPGPU на платформе GLES2, которая поддерживает максимальные цели рендеринга RGBA8 (iOS). Мне нужно вывести vec2 в диапазоне +/- 2.0 с такой же точностью, как я могу получить, поэтому я пытаюсь упаковать каждый компонент в два компонента 8-битного вывода.Высокоточный выход из шейдера GLES2
Важным требованием является то, что декодирование + кодирование в обратном направлении сохраняет закодированное значение. Мое текущее решение не имеют это свойство, и в результате мои ценности дрейфуют повсюду.
Это то, что я сейчас (это немного многословным, потому что я все еще думаю мой путь через него):
const float fixed_scale = 4.0;
lowp vec4 encode_fixed(highp vec2 v) {
vec2 scaled = 0.5 + v/fixed_scale; // map to range 0..1
vec2 low = fract(scaled * 255.0); // extract low order part
vec2 high = scaled - low/255.0; // subtract low from high order part
return vec4(low.x,high.x,low.y,high.y); // pack into rgba8
}
vec2 decode_fixed(highp vec4 v) {
vec2 scaled = v.yw + v.xz/255.0; // recombine low and high parts
return (scaled - 0.5) * fixed_scale; // map back to original range
}
EDIT: простой код, но до сих пор дрейфует