图形学 遮挡剔除算法综述

血红的双手。 提交于 2020-12-29 17:49:58

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 (背面消除)
    只适用于封闭物体
    通过每个面的法线来判断是正面还是背面,如果是背面,就隐藏。

作者:白痴毛 來源:简书

本文分享自微信公众号 - Unity3D游戏开发精华教程干货(u3dnotes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!