图形学学习笔记2

        继续上一篇的内容,之前已经记录了渲染管线中的顶点的三个变换,也就是MVP,我们得到了一个把图像压缩成了一个在XYZ三个轴上分别从-1到1的宽度为2的立方体。那么接下来需要做的一个步骤就是视口变换,因为我们最终是要把这个-1到1的立方体变成输出到我们屏幕的大小的一个2维图像的,这里就有一个像素的概念,像素就是屏幕上每个可以绘制的最小单位,比如我们说我们有个分辨率是1920X1080那么一般就是说有这么多个像素。

而经历过这一过程以后,相当于模型的上的每个三角面就已经显示在了屏幕上了,接下来要做的事就是按照每个三角面里的每个像素具体填充什么颜色的像素,这个过程就是光栅化。而shader中的Fragment函数就是参与了一部分的光栅化的处理,那么光栅化核心要解决的一个问题就是这个像素点在不在这个这个三角形的范围内,因为在三角形内才需要着色。

而使用的办法就是采样,所谓采样闫老师说的概念就是用像素中心对屏幕空间进行采样。而简单点的理解,其实采样就是求一个函数在不同参数下的值,这让我想起来动画里也有采样,比如对动画某一帧采样,其实就是得到你想要的第N帧下的动画的各个数据。都是差不多的概念。但对于每个像素的采样,毕竟像素是个方块,再小,他也是方块,但是三角面的每条边穿过去的地方却不一定就是覆盖整个像素的,比如刚好覆盖了一个像素的一半,那这个到底是算在三角形范围内,还是没在范围内呢?得出的结论是自己来判定,可以算,也可以不算。而判断一个点是否在三角形范围内就是使用叉乘来进行的。而对于每个三角形都要遍历整个屏幕的像素,这样效率太低了,人们又想到了一个优化的办法,那就是先确定三角面的AABB包围盒,因为在包围盒以外的像素,肯定是不在三角形范围内的,如下图所示:

而正因为每个像素都是一个小方块,那么这样采样得到的画面结果,就肯定会产生一个游戏中常见的问题:锯齿。看到这里,我终于理解了这么多年玩游戏的这个锯齿到底是怎么产生的了,而除了锯齿之外,还会产生另一个问题就是:摩尔纹。
其中解决锯齿的办法就是先对三角形进行模糊,然后再采样,但是不能先采样再模糊。
        以上就是目前学习到的光栅化和随之产生的一些问题的记录。

fantasycoding.net 2016-2024 © All rights Reserved京ICP备2020039454号-1