MIT 6.837:Visibility 可见性

MIT 6.837:Visibility 可见性

判断可见性通常是和光栅化同时进行的过程,它通过多种方法实现。

画家算法

37 - MIT 6.837:Visibility 可见性

画家在画场景时可以采用从后到前的顺序来画,这样可以保证前面的物体可以将后面遮住。如果物体可以按照深度顺序排序,先绘制深的物体,采用此方法可以决定可见性。

38 - MIT 6.837:Visibility 可见性

但空间中的先后顺序不一定可以定义全序,例如这个例子中 A、B、C 相互遮挡。但排序得到某种偏序对绘制也是有帮助的,例如处理透明物体时。

Z 缓冲区

在帧缓冲区中,除颜色值之外还记录物体在该像素处的 z 坐标值,通过 z 坐标来判断遮挡关系,自然可以正确得到可见性结果。

但在屏幕空间中 z 并不随 x 或 y 线性变化,因此无法简单插值得到三角形中某一像素的 z 值,但由于坐标关系中 $x’=x \cdot \dfrac{d}{z}$,因此 1/z 可以被线性插值得到,可以使用 1/z 代替 z 值存入 Z 缓冲区。伪代码如下

For every triangle
  Compute Projection, color at vertices
  Setup line equations, depth equation
  Compute bbox, clip bbox to screen limits
  For all pixels in bbox
    Increment line equations
    Increment curent_1ovZ
    Increment currentColor
    If all line equations>0 //pixel [x,y] in triangle	
    If current_1ovZ>1ovzBuffer[x,y]//pixel is visible
      Framebuffer[x,y]=currentColor
      1ovzBuffer[x,y]=current1ovZ

根据上面的原理,Gouraud 着色的线性插值也并非是正确的,因为三角面上的线性插值结果与屏幕空间中的插值结果不同。



发表回复

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据