Viewing 2 reply threads
  • Author
    Posts
    • #4350 Score: 0
      Vinal
      Participant

      注释中给的差值后的深度代码为:

      float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
      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;

      这个我不太理解。按照老师上课上课的讲解(见附图),我觉得深度应该是
      alpha * v[0].w() + beta * v[1].w() + gamma * v[2].w()
      上课ppt

      我觉得应该是下面两行注释没看懂,请问是否能做更详细的解释?非常感谢!

      
      //    * Z is interpolated view space depth for the current pixel
      //    * zp is depth between zNear and zFar, used for z-buffer
      • This topic was modified 4 years, 7 months ago by Vinal.
      Attachments:
      You must be logged in to view attached files.
    • #4352 Score: 0
      Angus
      Participant
      23 pts
      • #4356 Score: 0
        Vinal
        Participant

        谢谢 我详细看一下

      • #5747 Score: 0
        smile_zyk
        Participant

        我仔细看了代码框架,v[i].w()恒为1啊。

    • #6331 Score: 0
      WFan
      Participant

      这个问题我一开始也有疑惑,后来想了想,我的理解是:
      因为三角形的view变换涉及到了除以z,所以是一个非线性变换。也就是说原来在视椎体的三角形被压缩到了一个方块里面坐标的变化并不是线性的。如果用线性插值求出某一个像素的z值是不准确的,而z值又涉及到了像素的覆盖问题,所以需要根据三角形顶点本身的深度值重新计算出该像素在方块里的准确z值,至于计算方法楼上的大佬发的链接有详细的证明。
      至于颜色和法向量为什么可以用线性插值我认为是因为它们本身就是不精确的,就算在原来的三维空间也很难将某个点的颜色和法向量可以准确地计算出来,所以选择相信线性插值的结果。

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