相关博客:
1.MVP变换
2.Rasterization(光栅化)
此例中相机初始位置为(0,0,5)【备注:详见主函数中输入的值】经过
M
view
M_{\text{view}}
Mview?将相机移动到原点且相机方向朝向z轴负向,zNear与zFar均为负数
下图仅为示意图
此例中将空间中三角形绕z轴旋转,每一次按键A则左旋10度,每一次按键D则右旋10度
Projection Transformation包含两种:
1.Orthographic projection(正交投影)
2.Perspective projection(透视投影)
我们这里用透视投影(Perspective Projection)
透视投影的过程需要将视锥(Frustum)的远处面zFar挤压到与zNear同大小,随后进行正交投影
下图仅为示意图
为什么要挤压?因为要进行透视投影,只有挤压后才能体现出近大远小(小就是因为被挤压了)
挤压过程中zNear平面不变,即近处画面不变,zFar中心点位置不变,zNear与zFar之间的所有物体均被挤压
如果是进行正交投影,则无需挤压,直接进行投影即可
空间中的物体透视投影后,经过视口变换,将其投影缩放到与屏幕相适应的大小
左侧为透视投影结果,右侧为空间的俯视图
经过视口变换后的效果如下
如何用像素描述这个图像的投影?就是光栅化的意思,光栅化的本意是drawing onto the screen
三角形可以构成复杂图形,3D物体经过MVP变换到2D平面,随后通过光栅化进行渲染
利用三角形三边的三个向量叉积来判断像素中心点是否在三角形内,如果在三角形内,则对该像素进行采样(也就是所有屏幕中的像素中,属于图形内部的像素被选中),被采样的像素将进行上色
如果直接采样进行光栅化容易产生锯齿等走样问题
为了减轻锯齿问题,我们需要进行抗锯齿
需要的操作是光栅化之前进行模糊处理(滤波或者卷积操作),随后进行光栅化