采用OpenGL ES 2.0着色器的平滑纹理线条

时间:2012-07-07 12:13:46

标签: ios opengl-es drawing opengl-es-2.0 shader

我们有一个iOS绘图应用程序。目前,该绘图是使用OpenGL ES 1.1实现的。我们使用一些算法来平滑诸如贝塞尔曲线之类的线。因此,当触摸事件发生时,我们获得一些点触摸事件点(基于算法)并绘制这些点。我们还使用画笔纹理来获得更自然的画面。

我想知道是否可以在OpenGL ES 2.0着色器中实现这些算法。像调用OpenGL函数来绘制由触摸点和输出组成的线条的东西已经平滑了渲染的笔刷纹理曲线。

enter image description here

点P0,P1,...... P4这里是触摸事件和红色曲线上的点 - 输出点,这样的步长为T,使得曲线上两个相邻点之间的距离不大于1像素。

以下是Bezier算法解释的链接: Bézier curve - Wikipedia, the free encyclopedia

非常感谢任何帮助。 感谢。

1 个答案:

答案 0 :(得分:6)

您无法在顶点着色器中生成新顶点(您可以在ES没有的几何着色器中执行此操作)。输出顶点的数量始终与输入顶点的数量相同,您只能更改它们的位置(当然还有更好的属性)。

因此,您必须绘制由足够顶点构成的线条,以保证足够平滑的曲线。您可以做的是始终使用相同的线条,将曲线参数值T作为1D顶点位置。在着色器中,然后使用此输入位置(参数值)使用DeCasteljau算法(或其他)计算曲线上的实际2D / 3D位置,并将作为常量放入着色器的点P0到P4(均匀变量)用GLSL术语)。

但是我不确定这是否会真正为你购买任何东西而不仅仅是计算CPU上的这些点并将它们放入动态VBO中。您节省的是将曲线点从CPU复制到GPU以及CPU上的计算,但另一方面,顶点着色器要复杂得多。需要评估哪种方法更好。如果你需要计算每一帧的曲线点(因为控制点改变了每一帧)并且曲线是相当高的细节,它可能不是一个坏主意。但除此之外,我认为这不值得付出代价。此外,您的着色器在运行时也无法轻松适应不断变化的控制点数/曲线度。

但是再一次,你不能放入5个控制点并在GPU上生成N个曲线点。顶点着色器始终在单个顶点上工作并产生单个顶点,与片段着色器始终在单个片段上工作相同(比如像素,尽管它还不是一个)并且导致单个(或没有)片段