Home Forums Games202-高质量实时渲染 【作业1】请教下,shadowMap中深度的范围

Tagged: 

Viewing 2 reply threads
  • Author
    Posts
    • #8098 Score: 0
      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时,又能产生正确的阴影,这是为什么呢?
      谢谢答复

    • #8101 Score: 0
      青麈
      Participant
      -2 pt

      你的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;
      }

      • #8115 Score: 0
        DCXC
        Participant

        谢谢回复,glsl没法debug,我转成javascript了,初学glsl,不知道转对没有。
        不管怎样,根本上看,这个pack+unpack的逻辑是把一个[-1,1]范围内的值线性转换到[0,1]吗?

        • This reply was modified 3 years, 8 months ago by DCXC.
        • #8119 Score: 0
          Tiger Soldier
          Participant

          pack的输入已经是[0, 1]了,注意pack的是gl_FragCoord.z,这个值本身就是归一化过的

          • #8120 Score: 0
            DCXC
            Participant

            明白了,谢谢

          • #11375 Score: 0
            msdjy
            Participant

            你好,请问这个值gl_FragCoord.z,是通过哪一段代码得到的

    • #11383 Score: 0
      小木子
      Participant
      -1 pt

      这个pack-unpack的过程仅仅是为了增加传递数据的精度,前后的数值就是一样的没有必要纠结

Viewing 2 reply threads
  • You must be logged in to reply to this topic.