WebGL和/或Three.js:删除未渲染的面

时间:2015-01-07 17:03:57

标签: camera three.js webgl shader vertex

对于给定位置的给定网格,是否有一种快速简便的方法(使用vertexShader,fragmentShader或其他方法)从网格中识别/移除未在相机屏幕上呈现的所有面/顶点(隐藏在其他面孔之后,在视图之外等等。)

1 个答案:

答案 0 :(得分:2)

如果你的意思是删除 没有呈现,这可以通过启用backface culling来实现(默认情况下是这样)。

检测CPU上的背面

如果要从几何体本身中移除它们,则需要迭代面并计算面法线和外观/相机方向矢量之间的dot product,然后组合仅包含面的新几何缓冲区点积为正的地方。

检测CPU上的遮挡面

检测隐藏/遮挡的面部可以通过迭代面部并使用沿着外观向量挤出的三角形边缘构建三个平面来完成远距离剪切,并使用面部本身的翻转法线“前面”平面&#39 ;.通过这个你会得到一个开放式棱镜类型的形状。然后使用体积(技术上不是一个体积,因为它未关闭)来剔除剩余面的顶点,当一个面的所有顶点都位于所有平面上时(假设你的平面法线指向内部)有问题的脸被遮挡,可以移除。

即使使用像Bounding Volume Hierarchy这样的加速结构,也不会实时兼容

检测GPU / CPU上的遮挡面

另一种更简单且可能更快的方法是为每个面分配表示ID的唯一颜色,将几何体渲染到帧缓冲区,迭代该像素数据,将颜色位移回其各自的ID并构建可见列表面对那样。

更多信息

虽然通常没有在几何级别上完成,但请阅读the wikipedia article on occlusion culling以获取更多信息。