iOS Metal线宽

9

我想设置在Metal中绘制的线条的宽度。我可以使用point_size设置点的大小,如此处所述。

但是对于线条,它是如何工作的呢?

2个回答

8
简短的回答是,与Metal中的点大小相同的方式控制线宽度是不可能的。即使在OpenGL图形API中,用于执行此操作的函数(曾经存在的gllinewidth函数)现已过时。
一个选项是将线条作为四边形(盒子)绘制,使用两个三角形。这将允许您控制线条的宽度。
如果出于某种特定原因想坚持使用线条原语本身,则等效的OpenGL问题已经在StackOverflow上提出,如此处所示。该着色器可以简单地转换为Metal着色API。

6
如果你非要使用线而不是画两个矩形的2D框,你可以画出多条相邻的直线。你可以使用一个drawPrimitives调用多次绘制相同的两个顶点,只需增加instanceCount来模拟线的厚度,然后在你的顶点着色器函数中,你可以使用你的vertex_id和模数操作或其他类型的逻辑将线的位置转换以模拟厚度。这可能比尝试在片段着色器中做一些花哨的事情要容易得多。
如果你正在绘制多条直线,将你的instanceCount乘以你想要的线条厚度,并调整你的顶点着色器函数逻辑来将这些额外的线条放置在一起。
我尝试过这种方法,发现这是一个相当繁琐的过程。因为需要进行额外的数学计算才能正确定位额外的线条。例如,如果你正在画一条水平线并希望增加两倍的厚度,则应修改y值,但如果它是垂直的,则应修改x值。如果画的线条呈角度,则更复杂。如果你试图画形状,你还会遇到匹配长度和宽度的问题。
我认为最好的方法是画两个三角形来伪造一条线。数学会更容易和简单理解。
在几何中,欧几里得的线没有宽度,只有长度,在绘制时的宽度仅是为了表示而已。因此,尽管我认为用线条可能很好用于调试和开发,例如显示向量或创建网格以查看比例,但如果你试图将其样式化以呈现给用户,则不适合使用它们。在这种情况下,用错工具了。

这很有道理...但是将旋转应用于矩形似乎也很具有挑战性(至少我发现是这样的)。许多示例仅显示绘制一个没有任何旋转的正方形/矩形纹理。 - JCutting8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接