Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 关于作业2和作业3中Z-Buffer的问题

Viewing 8 reply threads
  • Author
    Posts
    • #7253 Score: 0
      Karlmeister
      Participant

      通过下面这个函数可以得到三角形内一点在view space中的深度
      float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
      为什么比较和更新Z-Buffer数组的时候要用zp这个变量呢?
      float zp = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
      zp *= Z;
      在经过投影变换以后,v.w表示顶点在view space的深度,v.z不是已经没有意义了吗,为什么这里要把v.z当做一种属性值进行插值得到一个zp呢?

    • #7254 Score: 0
      Karlmeister
      Participant

      我发现代码中如果v改成t.v,就会出问题,而所有v.w都是1…是不是这个t.v的坐标空间本身就有问题,xyz三个分量已经除过一次w,而w还是w没有变?所以我看大家求bounding box的时候也没有把齐次坐标里的w除去的样子。。

    • #7255 Score: 0
      Karlmeister
      Participant

      找到问题所在了,rasterize_triangle得到的三角形的顶点vector不是在齐次坐标系的坐标点,只有xyz三个值是除过w的,w保持不变。。。所以bounding box和后面公式里都用的是v的xyzw,且强制auto v = t.toVector4,即v.w恒为1。。。实在不明白为什么要这么写

      Attachments:
      You must be logged in to view attached files.
    • #7304 Score: 0
      叮叮咣咣
      Participant

      相同的疑惑,感觉有问题

    • #7305 Score: 0
      叮叮咣咣
      Participant

      尝试理解了一下,老哥来讨论下看看对不对

      Attachments:
      You must be logged in to view attached files.
    • #7690 Score: 0
      waqia
      Participant
      2 pts

      楼主搞明白了吗?为啥zbuffer的插值和齐次坐标最后一项有关系呢

    • #7714 Score: 0
      star
      Participant

      保留w是因为,mvp矩阵与点相乘后,w的值刚好是没变换前的z的负值,也就是说w是世界坐标系下的z值
      然后看一下这位同学写的文章里的公式
      先使用w的值求出Zt,再利用Zt来插值正确的深度,就如作业框架代码那样了

    • #7944 Score: 1
      小木子
      Participant
      -1 pt

      而且框架代码里算出来的w_reciprocal一直都是1,这没有异常吗?

      This post has received 1 vote up.
    • #7945 Score: 1
      小木子
      Participant
      -1 pt

      大家在这里集合,这位答主的长文和我的观点一致,作业框架里的吧w恒定为1的做法是一种近似(简化到把重心插值误差修正的算法效果给简化没),导致作业2中的w_reciprocal,作业3中的Z,论文中的Zt都是1,导致的结果就是误差修正的效果全部消失,还是使用了屏幕上的点所在位置去做了插值计算,并没有修正到view space中真正正确的点上

      This post has received 1 vote up.
Viewing 8 reply threads
  • You must be logged in to reply to this topic.