iOS金属线宽

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

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

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

简短的回答是没有办法以与Metal中的点大小相同的方式控制线宽。 即使在OpenGL图形API中,现在也不推荐执行此操作的function(以前作为gllinewidth函数存在)。

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

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

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

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

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

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

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