Viewing 3 reply threads
  • Author
    Posts
    • #4776 Score: 0
      nightwatch
      Participant
      3 pts

      作业3中,bump shader和displacement shader中 注释提供的计算方式计算出来的t和n不是垂直的。pbrt中提到了如何快速的根据一个单位向量构建局部坐标系: 法向量n去掉一个坐标,交换另外两个坐标并任意一个坐标取负并单位化得到t轴,叉乘得到n轴。
      代码如下
      ` auto n = normal.normalized();
      float x = n.x();
      float y = n.y();
      float z = n.z();
      Eigen::Vector3f t;
      if(x > y)
      {
      t= Eigen::Vector3f(-z,0,x)/std::sqrt(x*x + z*z);
      }
      else
      {
      t = Eigen::Vector3f(0,-z,y)/std::sqrt(y*y + z*z);
      }
      Vector3f b = n.cross(t);`

      第一个附件是作业里的代码,第二个是修改后的代码(差别不是很大

      Attachments:
      You must be logged in to view attached files.
    • #6427 Score: 1
      oxine
      Participant
      9 pts

      原来的代码不是这样的嘛
      // Vector t = (x*y/sqrt(x*x+z*z),sqrt(x*x+z*z),z*y/sqrt(x*x+z*z))
      其实把y分量取minus就行了,
      // Vector t = (x*y/sqrt(x*x+z*z),-sqrt(x*x+z*z),z*y/sqrt(x*x+z*z))
      你再和normal dot一下看看垂不垂直

      This post has received 1 vote up.
      • #6760 Score: 0
        lumixraku
        Participant

        改成负应该也不垂直吧 (x,y,z).(xy,-1,zy) 不等于0哎

    • #7778 Score: 0
      wlsdzyzl
      Participant

      改成负的就是垂直的了,第二个位置的sqrt是在分子位置不是分母的位置。

    • #22995 Score: 0
      SHakua
      Participant

      这差别很大了……t,b应该用实空间对纹理坐标的偏导数来求。作业里太简化了……

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