![e2be35b057ecc6aa6225771c10cd4324.png](https://i-blog.csdnimg.cn/blog_migrate/5883ea91e903b437a3cf98c824694c03.png)
本文基于闫令琪老师的 GAMES101 课程,包括课程内容和实验解析,旨在用文字版的通俗易懂的方式从零入门图形学,非常欢迎大家与我讨论。由于笔者能力有限,也欢迎大家的指正。
本文首发于知乎专栏图形图像与机器学习,以后会常更新,欢迎大家的关注与催更。
GAMES101 所有作业的代码:DQSSSSS/GAMES101_Assignment 。
本文附有 GAMES101 实验二详解。
引入
在上一篇文章中,我们介绍了 MVP 变换:如何把物体规范到成像的空间内。好比你给妹子拍照:
- Model transformation:妹子摆好姿势;
- View transformation:你摆好相机;
- Projection transformation:咔嚓!
等等,这个咔嚓是不是不太对?我们只是把空间变换好了,但是图像究竟怎么投影在屏幕上,还是一个问题。这里介绍一下光栅化(rasterization)技术,便是为了解决它产生的。
光栅化技术的思路,可以理解为在屏幕上画画,而画出来的就是所要成像的物体形成的画面。画面上的每个像素是一个作画单元,它可以定义为单通道灰度、三通道RGB、HDR甚至更复杂的内部结构,在此将其介绍为黑盒,或者理解为灰度、RGB之类简单情况即可。
考虑如何光栅化一个物体,不如先考虑如何光栅化一个三角形。因为现如今很多模型的表面是由三角形组成的,因为二维三角形有许多优点:在三维空间可以良好密铺、是最简单的形状、一定只会处于一个平面上等等。
![0981affb980f89cf6674a6e4201b32cc.png](https://i-blog.csdnimg.cn/blog_migrate/2ca5ce0ba436ff25d93d915701dabdad.jpeg)
下面就考虑怎么光栅化一个三角形。
光栅化:画一个三角形
做完 MVP 变换之后,我们已经把所有物体都放到了长方体里,唯一要做的事情就是把它们往一个面上投影。先考虑一个简单的问题:如果只有一个三角形,而且我们也知道它的颜色,如何把它显示到平面上?
方法很简单,首先将其投影到二维平面上,然后枚举每个像素,判断是否在三角形内,如果是则染色,否则跳过。一个像素是有大小的,我们用它的中心点来代替它,于是就变成判断中心点是否在三角形内。判断一个点是否在三角形内,只需要做叉积即可,详见实验部分的代码。
![a04aaa2a61ec5fa69ec06be7ecb81220.png](https://i-blog.csdnimg.cn/blog_migrate/109782682bad5526ad8b395797d2b655.jpeg)
如果遍历所有的像素,那实在是太慢了:因为不是所有的像素都需要被染色。一个物体的表面可能有成千上万个三角形组成,每个三角形都遍历所有像素的话