WebGL and/or Three.js:删除未渲染的面

WebGL and/or Three.js: Remove non rendered faces

对于给定位置的给定网格,是否有一种快速简便的方法(使用 vertexShader、fragmentShader 或其他东西)从网格中 identify/remove 所有未渲染的 faces/vertices在相机屏幕上(隐藏在其他面孔后面、视图中台外等)?

如果你的意思是删除不渲染它们这是通过启用backface culling来实现的(因为它是默认情况下)。

正在检测 CPU

上的背面

如果你想从几何本身中移除它们,你需要迭代这些面并计算面法线和你的 lookat/camera 方向向量之间的 dot product,然后组成新的几何缓冲区仅包含点积为正的面孔。

检测 CPU

上的遮挡面

检测hidden/occluded面可以通过迭代面和构建三个平面来完成,使用三角形边沿观察向量挤压远剪裁距离,并使用面本身的翻转法线'front plane'。这样你就会得到一个开放式棱镜形状。然后使用那个 volume(它在技术上不是一个体积,因为它没有关闭)来剔除剩余面的顶点,当一个面的所有顶点都位于所有平面内时(假设你的平面法线指向里面)有问题的脸被遮挡了,可以移除。

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

检测 GPU/CPU

上的遮挡面

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

更多信息

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