如何在使用glDrawArray()绘制的贝塞尔曲线的各个点处平滑地改变宽度

时间:2011-04-25 21:14:20

标签: iphone objective-c opengl-es

当用户用手指绘制时(我修改了glpaint),我成功地实时渲染了贝塞尔曲线。我可以在绘图之前调整线条的宽度。这导致整个线条绘制在这个新的宽度,但在线条的整个过程中保持恒定。但是我希望在这一行的过程中平滑的宽度变化。我还可以在用户绘制时动态调整画笔宽度,但由于以下原因,这会产生斑点线。

使用glDrawArray()以曲线渲染曲线。当用户绘制时,对于大约每几个触点,我的bezier函数可能计算数百个要渲染的点,此时它将这些点发送到要渲染的gldrawarray函数中。问题是宽度变化确实需要动态地沿这些点绘制,并且必须能够在这些传递点的绘制过程中改变画笔宽度,但是因为它们作为整个组被发送到函数中以进行绘制通过glDrawArray,在整个生产线上实现平滑的宽度变化已经证明是迄今为止难以捉摸的。

你知道如何通过一个用点绘制的bezier曲线实时获得不同的画笔宽度,并且理想地使用glDrawArray()绘制,而不需要使用三角形等吗?

1 个答案:

答案 0 :(得分:3)

AFAIK实现这一目标的唯一方法是创建一个填充多边形,其中骨架由原始路径决定,宽度沿长度变化,方法是移动与路径相切的每一边的顶点。

因此,您最终会围绕贝塞尔曲线构建闭合路径,因此: Variable width line based on bézier curve

每个控制点的宽度因两侧之间的距离而变化,以绿色显示。

我希望这张粗略的图表能够澄清上面的描述!