anchor.diff:  ****
   *当不透明阻挡时*
   
  -为什么我们需要维持一个点的列表？储存到眼睛最短距离的点就可以不需要这个列表。事实上，还可以做的更好：
  +为什么我们需要对每个像素维持一个点的列表？储存到眼睛最短距离的就可以不用这个列表。事实上，还可以做的更好：
   
   * 对图像上每个像素，设置z为无穷大。
   * 对场景上每个点。
   ** 投影后计算栅格化坐标。
   ** 如果当前点到眼睛的距离小于储存的距离，更新z。
   
  -你会发现，这和保存一个列表并排序的结果是一样的。那我们为何不这么做？因为这么做的前提是我们假设场景上所有的点都是完全透明的。一旦碰到半透明的情况会怎么样呢？显然，如果有半透明的点出现在同一个像素上，他们都可能会被看到。对此，就必须保存每个像素上所有的点，然后排序，利用特殊的混合算法（我们会在REYES算法课程里学到）计算出正确的像素值。
  +你会发现，这和保存一个列表并排序的结果是一样的。那我们为何不这么做？因为这么做的前提是我们假设场景上所有的点都是完全不透明的。一旦碰到半透明的情况会怎么样呢？显然，如果有半透明的点出现在同一个像素上，他们都可能会被看到。对此，就必须保存每个像素上所有的点，然后排序，利用特殊的混合算法（我们会在REYES算法课程里学到）计算出正确的像素值。
   ****
   
   
  
positive.code: 
  我们已经讨论过几次光线追踪和栅格化的不同之处。为什么选择这个而不是那个？正如之前提及，可见性排序，栅格化比光线追踪快。究竟为什么呢？转换几何体方式的栅格化终究需要花一系时间，但投影几何体本身很快速（只需要少数乘法、加法和减法）。相比起来，计算光线和几何体相交所需要很多的指令和更多的消耗。最主要的是光线追踪的渲染时间会随着场景中的内容成线性增长。因为必须要检测光线和场景中所有三角形是否相交。幸运的是这个问题可以利用*加速结构*得以缓解。加速结构背后的想法是，空间可以被分解（比如把一个包含所有几何体的盒子分解成几格，每格描述成盒子的子空间）物体存储在子空间。见示意图5
  
  image::http://www.scratchapixel.com/images/upload/rendering-3d-scene-overview/gridaccel.png[caption="图5：", title="加速结构的原则就是分解空间到子领域。光线从一个子领域穿梭到下一个时，我们只需要检测当前子领域里可能会产生相交的几何体，而不是所有几何体。这就节省了极大的消耗", alt="加速结构"]
  
  如果子空间比物体平均尺寸要大很多，意味着子空间包含了不止一个物体（当然这取决于物体是如何分布的）。我们不再检测场景内所有物体，而是先检测光线是否有相交的子空间（也就是，光线穿过的子空间），如果有，检测光线和该子空间中包含的所有物体是否相交，如果没有，直接跳过所有检测。这样只需要检测场景的一部分，节省很多时间。
  
  
negative.code: if (P_proj_raster.x == width) P_proj_raster.x = width - 1; 
  if (P_proj_raster.y == height) P_proj_raster.y = height - 1; 
  
  代码中需要注意的地方。第一是原点P，投影在屏幕空间和NDC空间的点，使用的是`Vec3f`和`Vec2f`类型，其坐标被定义为实数（浮点数），然而最终落在栅格空间的点使用的是`Vec2i`类型，其坐标被定义为整数（图像的像素坐标）。数组在程序中从0开始，因此，在栅格空间中的坐标点永远不会超过图像宽度或者高度。代码（14,15行）对其进行了检测并做了约束。同样，在NDC空间坐标原点位于图像的左下角，但是在栅格空间内原点位于左上角（见图3）。因此，坐标从NDC空间到栅格空间时需要反转。（代码8,9两行做了相对应的调整）
  
  但为何需要如此变换？解决可见性问题，要使用以下方法：
  
  * 映射所有在场景上的点。
  ** 对每个映射点，都需要把P'从屏幕空间转换到栅格空间。
  
    来自读者的问题：“你说，映射场景上所有的点。如何才能找到这些点？”。这个问题非常好。从技术角度讲，我们可以把三角形或者多边形对象划分成很小的集合元素，使其投影到场景上时不超过一个像素的大小。
  
  ** （利用栅格空间内的映射点）找到对应的像素点，把该点到眼睛的直线距离保存在一个特殊的列表中（深度列表）。
  * 最后，按距离由小到大排序每个像素所维护的列表中所有的点。处理的结果很明显，对于图像上任何像素，可见的点就是列表中的第一个元素。
  
    需要排序列表的原因是，投影的顺序是不固定的。假设在列表顶部插入点，而在投影A点后，投影了一个比A点离眼睛更远的B点，那么此时B点就位于列表顶部了。所以排序是必须的。
    
  这样的算法被称为*深度排序算法*。*对象深度的顺序（或者对象表面点的顺序）概念是所有栅格化算法的基础*。列举一些当今最有名的算法：
  
  * z-buffering算法。这个算法应该是这种类别里最有名的了。我们之前讲过的REYES算法就实现了z-buffering算法。该算法在技术上非常类似于我们讲述过的对象表面的点，如何投影在场景上以及保存在深度列表中。
  * 画家算法
  