iOS金属线宽

时间:2015-01-29 06:37:22

标签: ios metal

我想设置我在Metal中绘制的线条的宽度。我可以用point_size设置一个点的大小,如下所述:

https://developer.apple.com/library/prerelease/ios/documentation/Metal/Reference/MTLRenderCommandEncoder_Ref/index.html

但是,我不确定它如何与线条配合使用。

2 个答案:

答案 0 :(得分:5)

简短的回答是无法以与Metal中的磅值相同的方式控制线宽。即使在OpenGL图形API中,现在也不推荐使用这个函数(以前作为gllinewidth函数存在)。

一个选项是将线条绘制为四边形(一个方框),带有两个三角形。这可以让你控制线的宽度。

如果你想坚持使用行原语本身,由于某些特殊原因,已经在StackOverflow上询问了等效的OpenGL问题here。着色器可以简单地转换为Metal shading API。

答案 1 :(得分:3)

如果您设置使用线条而不是绘制带有两个矩形的2D框,则可以在彼此旁边绘制多条线。你可以通过一次drawPrimitives调用多次绘制相同的两个顶点来做到这一点,只需增加instanceCount来模拟厚度,然后在你的顶点着色器函数中你可以使用你的vertex_id和模数运算或某种其他类型的逻辑,用于平移线的位置以模拟厚度。这可能比尝试在片段着色器中做一些奇特的事情容易得多。

如果要绘制多条线,请将instanceCount乘以所需的厚度,然后调整顶点着色器功能逻辑,将这些附加线放在一起。

我对此进行了实验,发现这是一个非常繁琐的过程。因为您需要额外的数学运算来将额外的线条定位为正确加粗。例如,如果您要绘制水平线并希望将厚度增加2,则需要修改y值,但如果它是垂直的,则您需要修改x。以某个角度绘图变得更加复杂。如果你试图绘制形状,你也会遇到试图将长度与宽度匹配的问题。

我认为只绘制两个三角形来制作一个矩形来伪造一条线要好得多。数学将更容易理解。

在几何中,欧几里德的线条没有任何宽度,它们只有长度,它们在绘制过程中获得的宽度仅用于表示。因此,虽然我认为线条可能适合调试和开发,例如显示矢量或创建网格以查看比例,但如果您尝试设置它们以将其呈现给用户,则它们不是您想要的。在那种情况下,这是工作的错误工具。