有没有办法在用三角形带绘制的网格上实现类似行进正方形的东西?
Is there a way to implement something like marching squares on a grid drawn with triangle strips?
我目前正在使用一系列三角形条带绘制网格。我正在使用它来渲染高度场,并在顶点着色器中完全生成顶点数据,而无需任何输入缓冲区,仅使用顶点和实例索引。这一切都很好,而且效率很高。
但是,我现在发现自己也需要在这个网格上实现边界线。这里明显的解决方案是像行进方块。基本上,我想要实现的是这样的:
黑点表示网格中属于某个集合的顶点,我想对红线内的区域和红线外的区域进行不同的着色。
天真地,这看起来很简单:为顶点添加一个值,对于集合中的顶点为 1,对于集合外的顶点为 0,并根据插值是高于还是低于 0.5 进行不同的渲染, 例如.
但是,因为它呈现为三角形带,所以这不太有效。在实践中,由于它被呈现为三角形带,因此最终看起来像这样:
所以,一半的边缘有效,一半以丑陋的方形楼梯告终。
几天来我一直在绞尽脑汁是否有一些技巧可用于以不同方式生成顶点值或进行比 >0.5 更复杂的测试以更接近预期形状而不给出在漂亮而简单的三角形带上,必须提前实际生成几何图形,但我想不出一个。
有没有人处理过类似的问题?我是否缺少一些聪明的解决方案?
我在 Metal 中这样做,但我不希望这在很大程度上取决于所使用的特定 API。
听起来您正在尝试独立于下面的网格计算片段着色器中的颜色。如果是这样,您应该将颜色计算与网格分离。
假设您的占用存储在纹理中,使用textureGather
获取附近的四个占用值;确定边界方程;然后使用纹理坐标的小数部分来确定它相对于边界的位置。 (这里的问题在于细节——尤其是模棱两可的棋盘格模式。)
一旦您实施了上述方法,很可能您甚至不再需要三角形条状网格 — 只需用一个大四边形填充整个绘图区域,然后让片段着色器完成剩下的工作。
我目前正在使用一系列三角形条带绘制网格。我正在使用它来渲染高度场,并在顶点着色器中完全生成顶点数据,而无需任何输入缓冲区,仅使用顶点和实例索引。这一切都很好,而且效率很高。
但是,我现在发现自己也需要在这个网格上实现边界线。这里明显的解决方案是像行进方块。基本上,我想要实现的是这样的:
黑点表示网格中属于某个集合的顶点,我想对红线内的区域和红线外的区域进行不同的着色。
天真地,这看起来很简单:为顶点添加一个值,对于集合中的顶点为 1,对于集合外的顶点为 0,并根据插值是高于还是低于 0.5 进行不同的渲染, 例如.
但是,因为它呈现为三角形带,所以这不太有效。在实践中,由于它被呈现为三角形带,因此最终看起来像这样:
所以,一半的边缘有效,一半以丑陋的方形楼梯告终。
几天来我一直在绞尽脑汁是否有一些技巧可用于以不同方式生成顶点值或进行比 >0.5 更复杂的测试以更接近预期形状而不给出在漂亮而简单的三角形带上,必须提前实际生成几何图形,但我想不出一个。
有没有人处理过类似的问题?我是否缺少一些聪明的解决方案?
我在 Metal 中这样做,但我不希望这在很大程度上取决于所使用的特定 API。
听起来您正在尝试独立于下面的网格计算片段着色器中的颜色。如果是这样,您应该将颜色计算与网格分离。
假设您的占用存储在纹理中,使用textureGather
获取附近的四个占用值;确定边界方程;然后使用纹理坐标的小数部分来确定它相对于边界的位置。 (这里的问题在于细节——尤其是模棱两可的棋盘格模式。)
一旦您实施了上述方法,很可能您甚至不再需要三角形条状网格 — 只需用一个大四边形填充整个绘图区域,然后让片段着色器完成剩下的工作。