我正在学习WebGL中的阴影映射。我看到复制在各种库中的同一片着色器代码和实现这一点的示例。然而我没有找到解释它是如何工作的。将float浮动到vec4中 - 此代码如何工作?
想法是将深度值(单个浮点数)保存到颜色缓冲区(vec4)中。有一个包函数可以将float保存到vec4中,并且可以从vec4中解压浮动函数。
vec4 pack_depth(const in float depth)
{
const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);
const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
vec4 res = fract(depth * bit_shift);
res -= res.xxyz * bit_mask;
return res;
}
float unpack_depth(const in vec4 rgba_depth)
{
const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);
float depth = dot(rgba_depth, bit_shift);
return depth;
}
我会想到的是包装一个浮动到vec4应该是一个很重要的问题,只是把它复制到4个插槽vec4中的一套,让别人使用。这就是为什么上面代码中的位移逻辑令我感到困惑。
任何人都可以点亮一下吗?
我明白了。对我来说,即使我们给它一个vec4,颜色缓冲区在内部也不会将颜色值存储为4个整数。如果是这样,那么上面的代码是有道理的。谢谢。 – Jayesh 2012-03-27 04:12:19
严格来说,转换是一个32位的定点数 - 而不是一个浮点数。 – Mortennobel 2012-03-27 08:54:08