diff --git a/src/mol-gl/shader/utils/decode-float-rgba.glsl b/src/mol-gl/shader/utils/decode-float-rgba.glsl
new file mode 100644
index 0000000000000000000000000000000000000000..b55b14bf5fc1cfdaccdd23d6127443cedd981332
--- /dev/null
+++ b/src/mol-gl/shader/utils/decode-float-rgba.glsl
@@ -0,0 +1,5 @@
+float decodeFloatRGBA(vec4 rgba) {
+  return dot(rgba, vec4(1.0, 1/255.0, 1/65025.0, 1/16581375.0));
+}
+
+#pragma glslify: export(decodeFloatRGBA)
\ No newline at end of file
diff --git a/src/mol-gl/shader/utils/encode-float-rgba.glsl b/src/mol-gl/shader/utils/encode-float-rgba.glsl
new file mode 100644
index 0000000000000000000000000000000000000000..6ad94bfb178d7bbd2debc3a106270d44a78366c1
--- /dev/null
+++ b/src/mol-gl/shader/utils/encode-float-rgba.glsl
@@ -0,0 +1,8 @@
+vec4 encodeFloatRGBA(float v) {
+  vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * v;
+  enc = frac(enc);
+  enc -= enc.yzww * float4(1.0/255.0,1.0/255.0,1.0/255.0,0.0);
+  return enc;
+}
+
+#pragma glslify: export(encodeFloatRGBA)
\ No newline at end of file