Is it possible to store FP16 values in a RGBA8 texture, stored across RG and BA, like in this image? How would it be achieved in OpenGL 3.3+ with render textures and FBOs?
This is just off the top of my head, but couldn't you multiply by 255 and take both the integer part and the fractional part? Something like this:
vec2 normal = vec2(normalizedX, normalizedY);
normal = normal / 2.0 + 0.5; // <- This gets all values to be between 0 and 1
vec4 intNormal;
intNormal.r = (int)(normal.x * 255.0);
intNormal.g = (int)(fract(normal.x * 255.0) * 255.0);
intNormal.b = (int)(normal.y * 255.0);
intNormal.a = (int)(fract(normal.y * 255.0) * 255.0);
Then you could reconstruct them like this, I think:
vec4 intNormal = texture2D (gBuffer, coord); // Or wherever you get it from
vec2 normal;
normal.x = (float)intNormal.r / 255.0 + ((float)intNormal.g / 255.0) / 255.0;
normal.y = (float)intNormal.b / 255.0 + ((float)intNormal.a / 255.0) / 255.0;
normal = normal * 2.0 - 1.0; // <- this gets us back to -1.0 to 1.0 for the normal
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With