3

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

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

我想要的图表

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

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

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

在此处输入图像描述

所以,一半的边缘有效,一半的结果是丑陋的方形楼梯。

几天来,我一直试图绞尽脑汁,是否有一些技巧可以用来生成不同的顶点值,或者进行比 >0.5 更复杂的测试,以在不放弃良好和简单的三角形条带,必须提前实际生成几何图形,但我想不出一个。

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

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

4

1 回答 1

2

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

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

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

于 2021-10-18T14:43:42.057 回答