iOS 金属线宽

问题描述 投票:0回答:2

我想设置我在 Metal 中绘制的线条的宽度。我可以使用

point_size
设置点的大小,如here所述。

但是它如何处理线条?

ios line metal
2个回答
7
投票

简短的回答是没有办法像 Metal 中的点大小一样控制线宽。即使在 OpenGL 图形 API 中,执行此操作的函数(以前作为 gllinewidth 函数存在)现在已被弃用。

一个选项是将线绘制为四边形(一个盒子),带有两个三角形。这会让你控制线的宽度。

如果你想坚持使用线原语本身,出于某种特殊原因,已经在 StackOverflow 上提出了等效的 OpenGL 问题,如 here 所示。着色器可以简单地转换为金属着色 API。


5
投票

如果你死定了使用线条而不是绘制带有两个矩形的二维框,你可以绘制多条彼此相邻的线条。您可以通过一次

drawPrimitives
调用多次绘制相同的两个顶点来做到这一点,只需增加
instanceCount
来模拟厚度,然后在您的顶点着色器函数中,您可以使用您的
vertex_id
和模数操作或其他一些转换线的位置以模拟厚度的逻辑类型。这可能比尝试在片段着色器中做一些花哨的事情容易得多。

如果要绘制多条线,请将

instanceCount
乘以所需的粗细,然后调整顶点着色器函数逻辑以将这些额外的线彼此相邻放置。

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

我觉得画两个三角形做一个矩形来伪造一条线会好很多。数学会更容易理解。

几何中,欧几里德的线没有宽度,只有长度,画图时得到的宽度只是为了表示。因此,虽然我认为线条可能对调试和开发有好处,例如用于显示矢量或创建网格以查看比例,但如果您尝试设置样式以将它们呈现给用户,那么它们并不是您想要的。在那种情况下,它是错误的工作工具。

© www.soinside.com 2019 - 2024. All rights reserved.