使 GL_POINTS 看起来像一个 3D 矩形

Making GL_POINTS look like a 3D Rectangle

假设有一个 GL_POINTS 数组,并希望每个数组看起来都有不同的“高度”或“深度”,因此它们看起来不像是扁平的正方形散点,而是散点3D 矩形/直角矩形棱柱。

WebGL 中是否有一种技术可以实现这种效果?人们当然可以使用实际连接这些 3D 矩形的顶点,但我的目标是优化性能,因为我有大约 100,000 个这样的矩形要渲染,我认为点是最好的原语。

现在我在想一个人可能会使用一系列具有不同深度的点精灵,然后为每个点分配与所需深度最接近的精灵(有效地量化深度数据字段)。但是有没有办法让深度场保持连续呢?

如有任何关于此问题的指点,我们将不胜感激!

根据我的经验 POINTS 并不比创建自己的顶点快。此外,如果您使用 instanced drawing,您可以获得几乎相同数量的数据。您需要一个四边形,然后是每个矩形的位置、宽度和高度。不确定实例化是否与创建所有顶点一样快。可能取决于 GPU/driver

正如 point 在许多其他关于点的问答中指出的那样,最大点大小是 GPU/driver 特定的,允许低至 1 个像素。有很多 GPU 只允许大小 >= 256 像素(不知道为什么),还有一些只允许大小 >= 64。不使用 POINTS

的另一个原因

否则,POINTS 总是绘制一个正方形,因此您必须绘制一个足够大的正方形来包含您的矩形,然后在片段着色器中,discard 矩形外部的像素.

虽然这不太可能对速度有好处。正方形的每个像素仍然需要由片段着色器进行评估,这比绘制带有顶点的矩形要慢,因为那时甚至不考虑矩形之外的那些像素。此外,在着色器中使用 discard 通常比不使用它慢。这是因为,例如设置深度缓冲区,如果没有丢弃,则无需检查,深度缓冲区可以无条件地与着色器分开更新。使用丢弃深度缓冲区无法更新,直到 GPU 知道着色器是保留还是丢弃片段。

至于让它们看起来像 3D,我不确定你的意思。实际上点就像画一个正方形,所以你可以在那个正方形上放任何你想要的东西。 shadertoy 上的大多数着色器都可以调整为在点上绘制自己。我不会推荐它,因为它可能会很慢,但只是指出它只是一个四边形。在上面画a texture on them, draw a procedural texture on them, draw a solid color on them, draw a procedural snail

另一种可能的解决方案是,您可以将 normal map 应用到四边形,然后对这些法线进行照明计算,这样每个四边形都会根据其相对于您的灯光的位置获得正确的照明