用的是games101作业提供的框架:
1)右手坐标系。
2)view视角在摄像机坐标系下看向 -Z 方向。
作业1:
2)本框架作业1和作业2的齐次坐标 w 分量设置为 1。
作业2:
1)顶点经过MVP矩阵变换后,W分量存的是深度值,因为看向 -Z 方向,所有深度值w为负数,经过透视除法://Homogeneous division for (auto& vec : v) { vec /= vec.w(); }后,在NDC空间中,0 < z < 1
2)代码中的float f1 = (50 - 0.1) / 2.0; float f2 = (50 + 0.1) / 2.0; vert.z() = vert.z() * f1 + f2; 是为了将深度值0 ~ 1 映射到 0.1 ~ 50.0,为了之后插值计算出Z-Buffer。
3)重心坐标:三角形内任意一点P = αA + βB + γC 且 α + β + γ = 1
4)深度值插值计算代码中,float w_reciprocal = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w()); 这里的 v[i].w 本来应该是深度值,这个框架写死了= 1。又因为 alpha + beta + gamma = 1,所以 w_reciprocal 始终为 1,这里是因为涉及到深度值正负值的问题,本框架是看向 -Z 方向,但是到了 Z-Buffer,存的值是正值,应该是配合代码:z_interpolated *= w_reciprocal;适配多种写法吧,这里暂时不太懂。
5)这一步代码后,通过重心坐标插值3)计算深度值。
6)1、MSAA:将一个像素分割成四个采样块,判断四个采样块的中心点在不在三角形内,最后将比例乘给颜色,俗称比例法。 2、SSAA:也是将一个像素分割成四个采样块,先创建两个新的buffer:frame_buf_ssaa 和 depth_buf_ssaa,对三角形进行光栅化的时候更新它们的值,最后在绘画之前做downsampling,即把四个小像素的值加起来求平均,然后更新frame_buf 参考:https://zhuanlan.zhihu.com/p/454001952