浮点 – 在glsl中将rgb值解码为单个float而不进行位移

前端之家收集整理的这篇文章主要介绍了浮点 – 在glsl中将rgb值解码为单个float而不进行位移前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正忙于webgl中的延迟着色,我需要将3个整数值(在[0..256] = 256 ^ 3范围内)解码为单个32位浮点数并稍后对其进行编码.因为这是针对WebGL的,所以必须在没有按位操作的情况下完成.精确度对我来说并不重要(但我认为可以实现).

这是我所拥有的,但我认为这是错误的,因为我存储编码值的纹理的精度.

float packColor(vec3 color) {   return (color.r + (color.g*256.) + (color.b*256.*256.)) / (256.*256.*256.); }

vec3 decodeColor(float f) { 
float b = floor(f * 256.0);
float g = floor(f * 65536.0) - (b*256.);
float r = (floor(f * 16777216.0) - (b*65536.)) - (g*256.);
return vec3(r,g,b)/ 256.0;//vec3(r,b) / 256.0;  }

谢谢..

解决方法

我知道这是一个老问题,但我遇到了同样的问题,我会发布解决方案以防将来有人需要它
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]范围内标准化浮点数,你就会遇到精度问题!

请注意,您也不能存储alpha(以这种方式),因为highp浮点数是24位长,而不是通常使用的32位浮点数.在顶点着色器中,您可以毫无问题地使用此代码(默认精度为highp),但在片段着色器中,您必须确保仅使用高精度!

猜你在找的CSS相关文章