How We Render Extremely Large Point Clouds
GPU对”点“的渲染实际上是把”点“划分成两个三角形(光栅化 APIs rasterization rules),会有许多额外的计算量
优化内容:
点云排序(优化性能)
采用 Morton Order(Z-ordering)+ shuffle。
Z-ordering 把空间位置靠近的点排到邻近位置,可以大幅提升GPU工作线程的Cache命中率。
Z-ordering 可能带来的副作用是GPU工作线程间的竞争(多个线程同时对同一个像素位置执行写入)。对 Z-ordering 之后的点云序列在block级别进行 shuffle,使多个GPU线程访问不同空间区块的点,降低竞争概率。
深度平滑(优化效果)
使用color buffer + depth buffer存储最终要渲染的点的信息。
first pass:找出每个像素应该渲染的深度值,存到 depth buffer。
second pass:对每个像素,只要在离depth buffer中的深度距离很近(+-epsilon),则进行采样,对所有符合距离条件的点的颜色值取平均,得到该像素点应该显示的颜色。
Point Rejection and Hole Filling(优化效果)
排除被遮挡物体的点(背景物体);使用前景点的颜色来填充空隙。
Continuous Level of Detail (CLOD)(优化性能+平衡效果)
建立0~3共4个等级的LOD,3级为所有的点。
采样方法:0级对每个轴方向上每范围1m的空间内进行采样,每个平方米内取一个点(如有),颜色取平均。
1级采样尺度为0.5米,2级为0.25米。
优化内存吞吐量(优化性能)
量化批次(Quantized Batching)
按10240个点一组划分点云,并且每组内的点为临近点。
批次内的点位置以定点数表示,分高中低三个精度级别,渲染时根据距离远近选取精度级别(结合LOD)
Unity插件
数据前处理