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

Camera WebGL和/或Three.js:删除未渲染的面,camera,three.js,webgl,shader,vertex,Camera,Three.js,Webgl,Shader,Vertex,对于给定位置的给定网格,是否有一种快速简便的方法(使用vertexShader、fragmentShader或其他方法)从网格中识别/删除未在摄影机屏幕上渲染的所有面/顶点(隐藏在其他面后面、视图fustrum之外等)?如果您的意思是“删除”而不是渲染它们,那么这是通过启用背面消隐来实现的(默认情况下) 在CPU上检测背面 如果要从几何体本身中删除它们,则需要在面上迭代,并计算面法线和注视/摄影机方向向量之间的距离,然后合成新的几何体缓冲区,仅包含点积为正的面 检测CPU上的遮挡面 检测隐藏/遮

对于给定位置的给定网格,是否有一种快速简便的方法(使用vertexShader、fragmentShader或其他方法)从网格中识别/删除未在摄影机屏幕上渲染的所有面/顶点(隐藏在其他面后面、视图fustrum之外等)?

如果您的意思是“删除”而不是渲染它们,那么这是通过启用
背面消隐来实现的(默认情况下)

在CPU上检测背面

如果要从几何体本身中删除它们,则需要在面上迭代,并计算面法线和注视/摄影机方向向量之间的距离,然后合成新的几何体缓冲区,仅包含点积为正的面

检测CPU上的遮挡面

检测隐藏/遮挡的面可以通过在面上迭代并使用沿lookat向量按远剪裁距离拉伸的三角形边构建三个平面来完成,并使用面本身的翻转法线作为“前平面”。这样你就会得到一个开放式的棱柱形状。然后使用该体积(技术上它不是一个体积,因为它不是闭合的)来剔除剩余面的顶点,当一个面的所有顶点位于所有平面(假设你的平面法线指向内部)时,该面被遮挡并可以移除

即使在使用像a这样的加速结构时,也不会实时兼容

在GPU/CPU上检测遮挡的面

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

进一步信息

虽然它通常不在几何体级别上执行,但请阅读以获取更多信息。

如果您指的是“删除”,即不渲染它们,则可通过启用
背面消隐来实现(默认情况下)

在CPU上检测背面

如果要从几何体本身中删除它们,则需要在面上迭代,并计算面法线和注视/摄影机方向向量之间的距离,然后合成新的几何体缓冲区,仅包含点积为正的面

检测CPU上的遮挡面

检测隐藏/遮挡的面可以通过在面上迭代并使用沿lookat向量按远剪裁距离拉伸的三角形边构建三个平面来完成,并使用面本身的翻转法线作为“前平面”。这样你就会得到一个开放式的棱柱形状。然后使用该体积(技术上它不是一个体积,因为它不是闭合的)来剔除剩余面的顶点,当一个面的所有顶点位于所有平面(假设你的平面法线指向内部)时,该面被遮挡并可以移除

即使在使用像a这样的加速结构时,也不会实时兼容

在GPU/CPU上检测遮挡的面

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

进一步信息


虽然它通常不是在几何级别上完成的,但请阅读以了解更多信息。

我更多地是在寻找第二个选项。我关心的是隐藏的面孔。在同一个网格上,如果一个面位于另一个面的“后面”,但朝向摄影机,我认为点积将为正,但不应渲染该面。是吗?是的,你是对的,即使脸看不见,点积也是正的。您需要的是
遮挡剔除
。我已经编辑了我的答案,并添加了两种方法来检测被遮挡的脸,以及与该主题的进一步信息的链接。然而,在不了解您的用例的情况下,很难就好的方法提出建议。我的案例是3D绘制编辑器。在这个编辑器中,我需要能够在网格上投影图像。在Three.js中已经有了投影示例,但它们都是3D绘制编辑器。在这个编辑器中,我希望能够在网格上投影图像。我在Three.js中看到过投影示例(贴花),但它们基于3D矩形棱镜。投影是在立方体的所有顶点上进行的,即使是那些你看不见的顶点。我想在做投影之前“清洗”网格,这样只使用有效面。顺便说一句,如果您知道投影纹理(webgl/Threejs)的示例,其中原始纹理被修改,可以恢复以供进一步使用。我觉得现在很难。我不是一个三人组的人,所以我不能帮你举一些例子。将“paint”纹理投影回原始纹理应该只是计算透视变换到各个面UV上的问题,类似于光照贴图是如何完成的。但这应该是另一个问题,因为您要求的是遮挡剔除/隐藏面移除,而不是UV纹理投影。所以,接受我的答案,当需要的时候,创造一个新的问题。我更多的是寻找第二个选择。我关心的是隐藏的面孔。在同一个网格上,如果一个面位于另一个面的“后面”,但朝向摄影机,我认为点积将为正,但不应渲染该面。是吗?是的,你是对的,即使脸看不见,点积也是正的。您需要的是
遮挡剔除
。我编辑了我的答案并添加了两种方法