我没理解错的话,MVP变换之后,z的范围是-1到1,shadowFragment中直接pack了z,pack的结果把depth限定到了0到1。我把pack的逻辑转换成了js代码,如下:
function pack(depth) {
var bitShift = vec4.fromValues(1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0);
var bitMask = vec4.fromValues(1.0/256.0, 1.0/256.0, 1.0/256.0, 0.0);
var rgbaDepth = vec4.create();
vec4.scale(rgbaDepth, bitShift, depth);
for(var i=0; i<4; i++) {
rgbaDepth[i] -= Math.floor(rgbaDepth[i]);
}
var nn = vec4.create();
vec4.mul(nn, [rgbaDepth[1],rgbaDepth[2],rgbaDepth[3],rgbaDepth[3]], bitMask);
var result = vec4.create();
return vec4.sub(result, rgbaDepth, nn);
}
function unpack(rgbaDepth) {
var bitShift = vec4.fromValues(1.0, 1.0/256.0, 1.0/(256.0*256.0), 1.0/(256.0*256.0*256.0));
return vec4.dot(rgbaDepth, bitShift);
}
但是不是线性缩放的,特别是负数的时候,比如pack(-0.2)=[0.796875, 0.796875, 0.796875, 0.75], unpack出来是0.7999999970197678。在useShadowMap时,这个值怎么能和vPositionFromLight.z比较呢?我把vPositionFromLight.z线性缩放(z*0.5+0.5)到0到1时,又能产生正确的阴影,这是为什么呢?
谢谢答复