Я работаю над GPGPU на платформе GLES2, которая поддерживает максимальное количество целей рендеринга RGBA8 (iOS). Мне нужно вывести vec2 в диапазоне +/- 2.0 с максимально возможной точностью, поэтому я пытаюсь упаковать каждый компонент в два компонента 8-разрядного вывода.
Важным требованием является то, что декодирование + кодирование в обоих направлениях сохраняет закодированное значение. Мое текущее решение не обладает этим свойством, и в результате мои значения смещаются повсюду.
Это то, что у меня сейчас (это немного многословно, потому что я все еще обдумываю это):
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
}
РЕДАКТИРОВАТЬ: более простой код, но все еще дрейфует