简短的回答是没有办法像 Metal 中的点大小一样控制线宽。即使在 OpenGL 图形 API 中,执行此操作的函数(以前作为 gllinewidth 函数存在)现在已被弃用。
一个选项是将线绘制为四边形(一个盒子),带有两个三角形。这会让你控制线的宽度。
如果你想坚持使用线原语本身,出于某种特殊原因,已经在 StackOverflow 上提出了等效的 OpenGL 问题,如 here 所示。着色器可以简单地转换为金属着色 API。
如果你死定了使用线条而不是绘制带有两个矩形的二维框,你可以绘制多条彼此相邻的线条。您可以通过一次
drawPrimitives
调用多次绘制相同的两个顶点来做到这一点,只需增加 instanceCount
来模拟厚度,然后在您的顶点着色器函数中,您可以使用您的 vertex_id
和模数操作或其他一些转换线的位置以模拟厚度的逻辑类型。这可能比尝试在片段着色器中做一些花哨的事情容易得多。
如果要绘制多条线,请将
instanceCount
乘以所需的粗细,然后调整顶点着色器函数逻辑以将这些额外的线彼此相邻放置。
我对此进行了试验,发现这是一个非常繁琐的过程。因为您需要额外的数学来定位额外的线条以正确加粗。例如,如果您正在绘制一条水平线并希望将粗细增加两倍,您需要修改 y 值,但如果它是垂直线,您需要修改 x 值。以一定角度绘制变得更加复杂。如果您尝试绘制形状,您也会遇到尝试匹配长度和宽度的问题。
我觉得画两个三角形做一个矩形来伪造一条线会好很多。数学会更容易理解。
几何中,欧几里德的线没有宽度,只有长度,画图时得到的宽度只是为了表示。因此,虽然我认为线条可能对调试和开发有好处,例如用于显示矢量或创建网格以查看比例,但如果您尝试设置样式以将它们呈现给用户,那么它们并不是您想要的。在那种情况下,它是错误的工作工具。