Home › Forums › Games202-高质量实时渲染 › 【作业1】请教下,shadowMap中深度的范围
Tagged: 【作业1】
- This topic has 6 replies, 5 voices, and was last updated 3 years, 6 months ago by
小木子.
-
AuthorPosts
-
-
DCXC
Participant我没理解错的话,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时,又能产生正确的阴影,这是为什么呢?
谢谢答复 -
你的pack代码是不是有问题?作业1里面的pack代码不是你这样的。
vec4 pack (float depth) {
// 使用rgba 4字节共32位来存储z值,1个字节精度为1/256
const vec4 bitShift = vec4(1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0);
const vec4 bitMask = vec4(1.0/256.0, 1.0/256.0, 1.0/256.0, 0.0);
// gl_FragCoord:片元的坐标,fract():返回数值的小数部分
vec4 rgbaDepth = fract(depth * bitShift); //计算每个点的z值
rgbaDepth -= rgbaDepth.gbaa * bitMask; // Cut off the value which do not fit in 8 bits
return rgbaDepth;
}-
DCXC
Participant谢谢回复,glsl没法debug,我转成javascript了,初学glsl,不知道转对没有。
不管怎样,根本上看,这个pack+unpack的逻辑是把一个[-1,1]范围内的值线性转换到[0,1]吗?-
This reply was modified 4 years, 7 months ago by
DCXC.
-
Tiger Soldier
Participantpack的输入已经是[0, 1]了,注意pack的是
gl_FragCoord.z,这个值本身就是归一化过的
-
This reply was modified 4 years, 7 months ago by
-
-
这个pack-unpack的过程仅仅是为了增加传递数据的精度,前后的数值就是一样的没有必要纠结
-
-
AuthorPosts
- You must be logged in to reply to this topic.