美文网首页OpenGL游戏引擎程序员
图形学 遮挡剔除算法综述

图形学 遮挡剔除算法综述

作者: 白痴毛 | 来源:发表于2017-09-28 12:48 被阅读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 (背面消除)
      只适用于封闭物体
      通过每个面的法线来判断是正面还是背面,如果是背面,就隐藏。

    相关文章

      网友评论

      • Karel_:那个。。。。请问一下,我采用threejs做大场景的渲染用那种算法比较好呢
        Karel_:@白痴毛 那怎么判断遮挡呢
        白痴毛:@Karel_Xiang bsp树

      本文标题:图形学 遮挡剔除算法综述

      本文链接:https://www.haomeiwen.com/subject/goumextx.html