OpenGL游戏引擎程序员

图形学 遮挡剔除算法综述

2017-09-28  本文已影响589人  白痴毛

1. Hidden Line Removal (HLR)

光栅化的文章中,我们使用Z-Buffer来判断三角形面片是否遮挡,但Z-Buffer不适用于纯线框的模型的遮挡剔除。原因如下。


就如同上图左侧,在A点的位置,左侧的三角形由于只画边不画面,所以A点它是不画的,所以就没有Z值来与右侧的三角形的A点的Z值做比较,因此就没法判断A点是谁在前谁在后。

HLR算法总结

  1. Raycasting(光线投射)


  1. Painter’s Algorithm(画家算法)
    简单粗暴,先画后面的物体,后画前面的物体,就像画画一样,后涂的颜色会覆盖掉先涂的颜色。
    比较两个物体,当前视角来看,如果A的点全都在B的点前面,那么先画B再画A
    但缺点也很明显:
    1)如果A的点不全的B的前面,即A有些点从当前视角看是在B的某些点后面,就会失败。
    2)物体之间有相交的面时,会失败。
    (好像飞机的雷达显示是用的这个算法?)

  2. Warnock Algorithm (沃诺克算法)
    核心:分而治之
    不停的四分屏幕(一般是四分,也可以二分或者其他分),直到被细分的子空间只存在简单的前后关系(就是画家算法的那个要求),或者子空间已经细分到了一个像素点的大小。
    在曲面和抗锯齿中很有用。



    1)当前子空间没有多边形:完成!
    2)当前子空间只有一个多边形:画!
    3)当前子空间有简单的前后关系:画前面的!
    4)当前子空间只有一个像素那么大了:画离该像素点距离最近的多边形!
    5)否则,继续递归细分

  3. BSP-Tree (Binary Space Partioning trees, 二维空间分割树)


    不停二分,在每个存在简单前后关系的子空间里使用画家算法。
    优点
    1)可以处理带透明度的遮挡
    2)快:不用每个像素点都计算Z并检测
  4. Z-buffer
    新建一个数组,叫Z-buffer。
    每次将像素点颜色写入frame buffer时,把该点的Z值也写入Z-buffer。
    每次将像素点颜色写入frame buffer之前,如果该位置已经被写入过,拿出它的Z值与正准备写的点的Z值比较一下,谁离屏幕近写谁。
    是目前最流行的方法。
    优点
    1)简单
    2)高效
    缺点
    1)增加了内存空间,因为多了个Z-buffer
    2)受限于Z的量级 / 精确度
    3)过度渲染:每个像素点可能会写入多次。
    4)不支持透明度!(不支持透明度竟然还会最流行?)

2. 面片消除(Culling)

  1. Portals
    预先根据视角计算出哪些三角形可见,那些三角形不可见。
    (一换视角就GG了)

  2. 视锥Culling


    如果某物体全部顶点都在视锥外面,则不显示。
  3. Backface Culling (背面消除)
    只适用于封闭物体
    通过每个面的法线来判断是正面还是背面,如果是背面,就隐藏。

上一篇下一篇

猜你喜欢

热点阅读