可见性检测是为了从场景物品开始 尽可能多的去除不可见物体
基本思想:包围盒不可见则 三角形和像素一定不可见
可见再去判断三角形可见 再去判断像素可见
包围盒检测方式:基于视锥检测包围盒(视锥体内外检测和投影矩阵)
视锥体内外检测:
把点和面转到裁剪空间
依次检测包围盒的8个点对视锥体的6个面进行内外判断
比较大的缺点是不能检测特殊位置的物体 如下图右上角的
但这类物体不会太多 当然可以使用投影矩阵的方式进行裁剪 但投影矩阵的裁剪方式太耗时了? 不如直接渲染出来可能还快一点(比起用投影矩阵的方式)?
判断包围盒是否被其他物体遮挡是非常困难的 最好的方式就是用 深度测试来做检测 但这类检测依然是消耗太高 最好在之前就可以把物品剔除出去 下面介绍空间分割术
直接对空间进行分割 怎么划分空间 用物体数量来划分
超过一定数量就划分出来一个空间 最简单的方式就是动态四叉树结构
当当前空间超过一定数量时就对该空间进行划分
动态四叉树结构(用平行轴的方式分割),
二叉空间分割树BSP(任意方向的线分割):
经典BSP:分割所有物体 如果物体处于两区之间则直接把该物体分割为两部分
但这样做又不利于成批提交三角网格(合批)所以最好跟节点也行存储物品 当物体在中间时 不把该物体归类到叶子节点
做优化的思路大概可能就是先
用空间分割术判断空间
再用包围盒进行物体级别的判断
再用深度测试进行像素级别的检测