2012-07-07 257 views
6

我们有一个iOS绘图应用程序。目前,该绘图是用OpenGL ES 1.1实现的。我们使用一些算法来平滑诸如贝塞尔曲线等线。所以,当触摸事件发生时,我们从触摸事件点(基于算法)中获得一些点并绘制这些点。我们也使用笔刷纹理来获得更自然的效果。使用OpenGL ES 2.0着色器的平滑纹理线条

我不知道是否有可能在OpenGL ES 2.0着色器中实现这些算法。像调用OpenGL函数来绘制由触摸点和输出组成的线条,可以呈现平滑的画笔纹理曲线。

enter image description here

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

这里是用贝塞尔曲线算法解释链接: Bézier curve - Wikipedia, the free encyclopedia

任何帮助深表感谢。 谢谢。

+0

你能更具体吗?如果我们不知道算法是什么,我们无法告诉您是否有可能在着色器中实现特定算法! – user1118321 2012-07-07 14:29:26

+0

我们使用什么算法并不重要。这里的要点是着色器应该比输入点在输出上产生更多的点。我编辑了我的问题,并用Bezier算法添加了一个例子。 – 2012-07-07 20:09:21

回答

6

您不能在顶点着色器内生成新的顶点(您可以在几何着色器中执行此操作,而ES不具备此功能)。输出顶点的数量总是与输入顶点的数量相同,您只能更改它们的位置(当然还有其他属性)。

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

但我不确定这是否真的会为您购买任何东西,只是计算CPU上的这些点并将它们放入动态VBO中。你保存的是将曲线点从CPU复制到GPU和CPU上的计算,但另一方面你的顶点着色器要复杂得多。需要评估哪种方法更好。如果你需要计算每一帧的曲线点(因为控制点改变了每一帧)并且曲线相当详细,这可能不是那么糟糕的想法。但否则我不认为它真的付出。而且你的着色器在运行时不易适应变化的控制点/曲线度数。

但是再一次,您不能放入5个控制点并在GPU上生成N个曲线点。顶点着色器总是在单个顶点上工作,并产生单个顶点,与片段着色器一样,它总是在单个片段上工作(比如像素,虽然它还没有),并导致一个片段(或没有片段) 。

+0

感谢您的非常全面的答案! 我一直在寻找一种方法来使代码更清晰,并获得一些性能。但是,正如我所看到的,情况并非如此。顺便说一句,你提出了非常有趣的方法,传递代表T的一维线。我会考虑周围的。 – 2012-07-07 21:29:22

+0

当然:)我只是按下输入从新行写,它发送评论:) 再次感谢! – 2012-07-07 21:33:56