作业2中有这样一段代码:
float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
z_interpolated *= w_reciprocal;
作业3中有这样一段代码:
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;
猜想这两段代码正在进行插值和重心坐标的投影透视矫正(因为重心坐标在投影后会改变)。
但是我无法理解其具体计算过程,即使我在作业2中已经使用提供的代码完成了正确的输出。
因为在 rasterize_triangle 函数中有:
auto v = t.toVector4();
而 toVector4 函数则将第四维,即 v[i].w() 设置为了 1 ,这是符合齐次化表示的,但我也因此无法理解为何要在计算插值的时候使用类似 alpha / v[0].w()
之类的操作。除以固定的值 1 有何意义?这里的计算不应当是 alpha / v[0].z()
吗?
另外,我无法找到课程中提到的作业三的 FAQ ,这可能与此有关,如果有人能提供该帖地址,十分感谢。