【问题标题】:Is there a way to implement something like marching squares on a grid drawn with triangle strips?有没有办法在用三角形条带绘制的网格上实现类似行进正方形的东西?
【发布时间】:2021-12-05 02:52:26
【问题描述】:

我目前正在使用一系列三角形条带绘制网格。我正在使用它来渲染一个高度场,并在顶点着色器中完全生成顶点数据,而无需任何输入缓冲区,只使用顶点和实例索引。这一切都很好,而且非常有效。

但是,我现在发现自己也需要在这个网格上实现边界线。这里明显的解决方案是行进广场之类的。基本上,我想要实现的是这样的:

黑点表示网格中属于某个集合的顶点,我想对红线内的区域进行不同的着色。

天真,这似乎很容易:向顶点添加一个值,对于集合中的顶点为 1,对于集合外的顶点为 0,并根据插值高于或低于 0.5 进行不同的渲染,例如实例。

但是,因为这是呈现为三角形条带,所以这并不完全有效。在实践中,由于它被渲染为三角形带,最终看起来像这样:

所以,一半的边缘可以工作,而一半的边缘最终会变成丑陋的方形楼梯。

我这几天一直在琢磨我的大脑,是否有一些技巧可以用来生成不同的顶点值,或者进行比 >0.5 更复杂的测试,以在不放弃的情况下更接近预期的形状漂亮而简单的三角形条带必须提前实际生成几何图形,但我想不出一个。

有没有人处理过类似的问题?我是否缺少一些聪明的解决方案?

我在 Metal 中执行此操作,但我不希望这在很大程度上取决于所使用的特定 API。

【问题讨论】:

  • "我想要达到的目标是这样的" 什么算法可以从点域中生成这样的东西?具体来说,最后的长线没有任何意义。中间没有点来支撑这么长的线。
  • 行军广场,正如我在帖子中提到的,会做到这一点。
  • 然后...使用该算法。你是说你在使用那个算法却没有得到正确的结果?
  • 问题是有没有办法在保留当前基于三角条的渲染方式的同时,模拟行进方格的结果,其他原因非常有用。
  • @NicolBolas:我不认为 OP 试图画线。 OP“希望对 ... 线内的区域进行不同于其外部的阴影”。因此,大概这些线条只是阴影区域内部和外部之间边界的图示。

标签: opengl 3d gpu metal gl-triangle-strip


【解决方案1】:

听起来您正在尝试独立于下面的网格计算片段着色器中的颜色。如果是这样,您应该将颜色计算与网格分离。

假设您的占用存储在纹理中,使用textureGather 获取附近的四个占用值;确定边界方程;然后使用纹理坐标的小数部分来确定其相对于边界的位置。 (这里的魔鬼存在于细节中——尤其是模棱两可的棋盘模式案例。)

一旦您实施了上述方法,您很可能甚至不再需要三角形带状网格——只需用一个大四边形填充整个绘图区域,然后让片段着色器完成剩下的工作。

【讨论】:

  • 好吧,既然我在顶点着色器中读取相同的纹理,我想我希望通过不在片段着色器中再次读取它来中断内存带宽,但你是对的那会很好用。由于其他原因,我仍然需要三角条,但也许我确实需要考虑这样做。 (另外,我的数据不会有很多棋盘格,我为他们做什么并不重要,所以至少这不是我需要的头痛。)
  • 但这确实给了我一个想法:我可以在顶点着色器中获取这些数据,并将其存储为平面值,然后在片段着色器中使用它。这节省了片段着色器的内存访问,但让我做你建议的同样的事情!我想会这样试试!
  • @DagÅgren 我可能弄错了,但这不一定会节省内存带宽。顶点着色器的值不会神奇地出现在片段着色器中;据我了解,它在 GPU 上的实现方式是顶点着色器将其输出写入片段着色器调用从中读取的临时内存缓冲区。
  • 有可能。此外,如果您正在绘制许多小三角形和被剪裁的三角形,则在片段着色器中读取可能会更快,但至少这种方式很容易同时尝试和比较。
猜你喜欢
  • 2017-11-23
  • 2017-01-03
  • 2022-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
相关资源
最近更新 更多