首页 文章

iOS金属线宽

提问于
浏览
6

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

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

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

2 回答

  • 5

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

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

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

  • 2

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

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

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

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

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

相关问题