剔除网格上方的部分

Cull off parts above the mesh

所以,我想制作与此相同的场景Sphere Scene

现在我有了随机生成的网格作为地面和球体。但我不知道如何剔除网格上方的球体几何体。尝试使用 Stencil 和 hightmap。 Stencil 在前面渲染了地面,但仍然渲染了地面上方的球体。使用高度图来了解它是否需要渲染(我比较了高度图和 worldPos)是有问题的,因为纹理叠加在所有球体上,而不是投影到它上面。你能帮我吗。是否有任何着色器功能可以剔除以上所有网格。

几年前,我为 Asteroids 演示做了类似的事情。每当一颗小行星被击中时,我都会使用高度贴图——实际上,只是一张噪声贴图——来偏移小行星模型上一半的顶点,让它看起来像断成两半。对于另一半,我只是复制了小行星模型并使用相同的噪声图偏移了另一半。结果是两个"halves"完美匹配。

这是我要尝试的方法:

  1. 您的球体模型应该是一个完整的球体。
  2. 您需要地形的高度图。
  3. 在球体的顶点着色器中,对于赤道以北的任何顶点:
    • 采样高度图。
    • 将顶点的Y坐标设置为高度图中的高度。这将有效地压平球体的顶部,然后根据您的高度图对其进行偏移。您可能必须在此处缩放高度值才能获得合理的结果。
    • 照常变换新的 x,y,z。

请注意,您没有纹理化 球体。您正在修改几何体。这需要在管道的几何部分发生, 而不是 在片段着色器中。

您需要考虑的另一件事是如何添加碎片 - 岩石等 - 以使其与球体上的几何偏移相匹配。既然你有一个高度图,那应该很简单。

首先,我会让你的顶点着色器展平球体的上半部分。一旦成功,添加高度贴图。

为了使这看起来令人信服,您需要相当高分辨率的球体和高度图。要减少几何图形,您可以使用平面作为地形,使用半球作为底部。只需丢弃不在您感兴趣的球形体积内的平面的任何片段。(您也可以使用圆形 "plane" 而不是矩形平面,但要让顶点与球体对齐并填充边界处的洞可能很棘手。)

正如我所意识到的,没有标准的方法可以在没有人工制品的情况下剔除它。唯一可以做到的方法是使用 raymarching 渲染。