#6935 Score: 14
zzb
Participant
14 pts

前面的回答都没有说到点子上!
首先,你进行了光栅化,然后这个时候你其实是只知道像素坐标x,y的,经过深度插值,你得到了screen space中对应的某点的坐标(x,y,z)。这个坐标其实也不是真实世界(或者说camera space)里面的点!因为你想projection矩阵本质上是把视锥压缩成了长方体,你算出来的这个坐标是经历了压缩之后的。
那么怎么才能知道camera space中像素对应过去的那个点呢?当然是插值!也就是利用alpha,beta,gamma结合rasterize_triangle传进来的参数viewspace_pos插值出来一个空间中的点。
好了,我们得到了这个所谓的interpolated_shadingcoords,这个点有什么意义呢?这个点其实就是camera space中你真正在着色的那个点!这个点是你插值出来的,所以起了这么个名字。
这个点知道了有什么用?你想想Bling Phong反射模型是不是需要一个叫r的参数,也就是着色点到光源的距离?我们需要拿光源位置和这个着色点来计算出r,同时得到一个light ray的单位向量(也就是那个所谓的向量l)!
最后一个点:我们的重心坐标明明是在2D空间里做的啊?为什么可以拿来插值3D空间的坐标呢?
答案是不行的!这个alpha,beta,gamma本质上是需要经过矫正才能用的!但是!其实误差不大,我们就直接拿过来用了。详见(https://stackoverflow.com/questions/24441631/how-exactly-does-opengl-do-perspectively-correct-linear-interpolation#:~:text=Perspective%20correct%20interpolation,-So%20let’s%20say&text=First%20we%20calculate%20its%20barycentric,on%20the%202D%20triangle%20projection.)

This post has received 14 votes up.