刚写完作业3来答一发!
(一开始也完全不明白,因为老师讲课的时候其实没有提的很清楚。是看了程序框架然后猜出来的。。)
以下是我的理解:
首先在rasterizer.cpp里可以看到,interpolated_shadingcoords计算出来以后,直接赋给了payload.view_pos。
然后在main.cpp中,可以找到payload.view_pos的最终用途是phong_shader用来做shading的那个三维空间坐标点,也就是shading2里面讲的blinn-phong光照模型的光线作用点。知道了这个点,就可以用来计算光线相关的参数了,比如:1.跟光源的距离R;2.跟视点之间的向量,然后计算出半程向量h。这一切都发生在哪个空间呢?答案是view space。
这里有一个地方一定要搞懂。。。那就是光线作用是在哪一步进行。我的理解是在view space进行。
经过了MV变换(model变换+viewpoint变换)的空间就是view space,这时所有空间点之间的相对位置都还是正常的,所以我们要在这个view_space来做shading,来计算光的入射和空间点的作用,这样才是正常的。
经过了MVP变换的空间还是三维空间,但已经是被透视变换distorted的三维空间,因为Z被压缩了,所以不能用这个空间来做光线作用;
经过了MVP变换+viewport变换的空间叫做screen space,已经是二维空间点了,准备好成为像素了。
从rasterizer.cpp中的draw()函数中可以看到,viewspace_pos是只经过了MV变换的,是view space坐标,然后被传递给rasterize_triangle()。在每一个像素上插值后,成为interpolated_shadingcoords,传递给shader去做光线作用了。来龙去脉就是这样。
This post has received 2 votes up.