Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 作业3 为什么Phong Shader里要用eyepos减去point

Viewing 3 reply threads
  • Author
    Posts
    • #6261 Score: 0
      WFan
      Participant

      翻了下之前的帖子,发现很多人都是写的v=eye_pos-position,这么做得出来的结果如图2,和给的例子一样。但是我觉得应该直接让v=-position就行了,这么做得出来如图3,可以看到高光处有些区别。

      理由是,传给Phong Shader的点是乘过view矩阵的(源码也确实是这样,如图1),所以point的坐标已经是以eye为原点的坐标,光源的坐标也应该是相对于eye的坐标。这样的话计算v的时候就不需要考虑eye的坐标了呀。求各位解答,不知道是不是我的理解有问题。

      Attachments:
      You must be logged in to view attached files.
    • #6288 Score: 0
      ManiacWong
      Participant

      最近几天才发现这套课程,想回来重新巩固下知识点,还没仔细看代码。
      首先向量eye_pos-position的意义是这个顶点Vertex到eye的向量,如果是-position,那就成原点到顶点的向量了。
      乘以view矩阵是让顶点进入了view space,那么顶点现在对应的原点的确是eye的位置,如果是这样的话,那其实是不正确的。
      一般写Specular代码的时候在Vertex Shader会保留一个World Position,用顶点POS乘以world matrix,和经过world view projection变换的顶点有所区别。 然后PosW传到Pixel Shader后再用这个PosW计算

      • #6289 Score: 0
        WFan
        Participant

        我觉得应该是这样的,所以作业3里要么传到shader里的点不要乘view矩阵(这样合理,因为光照坐标是全局的了,不用随着eye的移动更改),要么就把所有的坐标看作是相对于原点的坐标,不要考虑eye的位置。有说错的地方欢迎指正,希望老师或者助教能看到。

    • #7676 Score: 0
      Dante
      Participant

      是呀,感觉应该是框架代码写错了,有人解答一下吗?

    • #7750 Score: 0
      jason411
      Participant

      同求解答。猜测本意是eye就等价于camera,可以从main.cpp里面印证,构造view矩阵传入的eye_pos和fragment_shader里面写死的eye_pos取值是一样的。但是传入shader的是相机空间的坐标不是世界坐标,那么eye的位置就是原点。

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