Home Forums Games202-高质量实时渲染 给WpenumbraRatio乘上NEAR_PLANE / zReceiver效果更好

Viewing 1 reply thread
  • Author
    Posts
    • #8014 Score: 0
      鲤伴若菜
      Participant
      1 pt

      在做PCSS时,看到nv的一篇文章里面的filterRadiusUV 多乘了个NEAR_PLANE / zReceiver。试了一下得到的效果更好了。猜测可能是因为越远的着色区域在shadowmap上占的像素量就越小,所以采样半径也要随着缩小。不知道对不对。
      第一幅图是乘了的效果。第二幅图是不乘的效果

      Attachments:
      You must be logged in to view attached files.
    • #8019 Score: 0
      cmc233
      Participant
      5 pts

      代码里NEAR_PLANE/coord.z应该是NEAR_PLANE/(coord.z*FAR_PLANE + (1.0-coord.z)*NEAR_PLANE)吧?
      按作业里的场景布置,对于阴影区域来说,NEAR_PLANE / zReceiver应该蛮小的吧,再乘以这个系数,阴影会变得很硬?感觉你是不是因为NEAR_PLANE设置的是0.1左右,所以用0.1/coord.z才能得到一个比较合适的缩小?纯属胡乱猜测,如果你coord.z已经做了空间转换就当我啥都没说orz

      • #8021 Score: 0
        鲤伴若菜
        Participant
        1 pt

        coord.z和nearplane都是归一化之后。coord.z已经转换到了[0,1]。我知道乘了这个阴影会变硬一些,但依旧有软的效果。因为不知道乘上这个有什么物理意义,就瞎猜了一下,哈哈。就贴上来大家讨论一下

        • #8022 Score: 0
          cmc233
          Participant
          5 pts

          你怎么归一化的nearplane?在0到1里,nearplane不是0吗?

          • #8025 Score: 0
            鲤伴若菜
            Participant
            1 pt

            不是0啊,我的远近平面是0.1和500

            • #8026 Score: 0
              cmc233
              Participant
              5 pts

              是啊,所以zReceiver = 500*coord.z+0.1*(1-coord.z)啊,你拿0.1/coord.z就没有意义啊(你下面的回复不是理解的挺清楚的吗,得在相机空间算距离比)。
              ps,如果你在计算距离比的时候没有转化到相机空间,那么你计算blocker depth里fliter size要乘的(zReceiver – NEAR) / zReceiver可能也有问题,你的结果看上去没问题只是因为你的NEAR取的是0.1,而场景范围里按(0.1,500)得到的coord.z都是大于0.1的

        • #8023 Score: 0
          cmc233
          Participant
          5 pts

          还有,突然想到,作业里shadow map推荐用的是正交投影,所以不会有“近大远小”;如果是用仿射投影的话,感觉这种想法是有道理的

          • #8024 Score: 0
            鲤伴若菜
            Participant
            1 pt

            我搞明白了,这个是给透视投影用的。WpenumbraRatio是在相机空间算的,需要计算它投影到shadowmap上的大小。如果渲染shadowmap用的是透视投影,那根据相似三角形乘上NEAR_PLANE / zReceiver就是WpenumbraRatio在shadowmap上的大小。

            • #8065 Score: 0
              Tecomo
              Participant

              penumbraRatio = (dReceiver – dBlocker) / dBlocker;
              penumbraRatio = penumbraRatio * lightSize * NEARPLANE / dReceiver;
              按理说直接penumbraRatio * lightSize就是filtersize了,后面这两是在干嘛?

              “如果渲染shadowmap用的是透视投影,那根据相似三角形乘上NEAR_PLANE / zReceiver就是WpenumbraRatio在shadowmap上的大小”

              这句还是没太明白,三角形是哪几个边构建的?方便的话可以麻烦画个图吗?

Viewing 1 reply thread
  • You must be logged in to reply to this topic.