【移动应用开发技术】在iOS中使用OpenGL ES实现绘画板的方法_第1页
【移动应用开发技术】在iOS中使用OpenGL ES实现绘画板的方法_第2页
【移动应用开发技术】在iOS中使用OpenGL ES实现绘画板的方法_第3页
【移动应用开发技术】在iOS中使用OpenGL ES实现绘画板的方法_第4页
【移动应用开发技术】在iOS中使用OpenGL ES实现绘画板的方法_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】在iOS中使用OpenGLES实现绘画板的方法

今天我们使用OpenGLES来实现一个绘画板,主要介绍在OpenGLES中绘制平滑曲线的实现方案。首先看一下最终效果:在iOS中,有很多种方式可以实现一个绘画板,比如我的另外一个项目MFPaintView就是基于CoreGraphics实现的。然而,使用OpenGLES来实现可以获得更多的灵活性,比如我们可以自定义笔触的形状,这是其他实现方式做不到的。我们知道,OpenGLES中只有点、直线、三角形这三种图元。因此,怎么在OpenGLES中绘制曲线,是我们第一个要解决的问题,也是最复杂的问题。我们会使用比较大的篇幅来讲解这个问题。至于绘画板的其他功能实现,并不是说不重要,只是说其他的绘画板实现方式,也会有类似的逻辑,所以这部分会放在最后再简单介绍一下。一、怎么绘制曲线在OpenGLES中绘制曲线的方式,就是将曲线拆分成点序列来绘制。因为要绘制点,所以我们采取的是点图元。即我们要把顶点数据当成点来绘制,并且每个点都要绘制出笔触的纹理。关键步骤如下:指定图元类型:顶点着色器:片段着色器:这里的关键点在于gl_PointCoord这个内置变量,当我们使用点图元的时候,可以通过这个变量获取到当前像素在点图元中的归一化坐标。但是这个坐标的原点是在左上角,这和纹理坐标在竖直方向上是相反的。所以从纹理读取颜色的时候,要做一个y坐标的转换。接下来,我们通过UITouch来获取触摸点的位置,然后算出归一化的顶点坐标。但是由于iOS系统触摸事件的派发频率有限,我们最终得到的只能是稀疏的点。如下图所示,每个触摸点之间的间隔会比较大。二、怎么绘制密集的点很容易想到,只需要在两个点之间,按照一定的密度进行插值,就可以绘制出连续的轨迹。但是很明显,我们的绘制结果是折线,并不平滑。三、怎么使曲线变平滑解决点连接不平滑的问题,一般是使用贝塞尔曲线。这种方案在MFPaintView中也得到了很好的应用。具体的做法是使用两个顶点间的中点和一个顶点,来构造一条贝塞尔曲线。如下图,图中的3个红点被用来构造一条贝塞尔曲线。于是,我们的问题就变成了怎么在OpenGLES中绘制贝塞尔曲线。相当于已知贝塞尔曲线的3个关键点,反向来求曲线上的点序列。我们知道贝塞尔曲线的方程是P=(1-t)^2*P0+2*t*(1-t)*P1+t^2*P2,t是唯一的变量,其取值范围是0~1。所以我们可以采取线性取值的方式,每一条贝塞尔曲线取n个点(n是个确定的常量)。只要依次往方程中代入1/n、2/n、...n/n,就可以得到一个点序列。先将n取一个比较小的值,这样比较容易看出存在的问题。我们发现,点序列的间隔并不均匀。原因有两个:四、怎么生成均匀的点序列贝塞尔曲线生成均匀的点序列,涉及到了一个经典的「贝塞尔曲线匀速运动」问题。这个问题的推导和计算比较复杂。如果你有兴趣,可以阅读一下文末的两篇文章。由于我还不能完全领悟,就不在这里误导大家了。简单来说,就是我们通过一系列的骚操作,封装了一个方法,只需要传入贝塞尔曲线的3个关键点和笔触尺寸,就可以获取均匀的点序列。下面我们固定贝塞尔曲线的起始点和控制点,只移动终止点,来验证一下这个方法是否可靠。可以看到,在移动过程中,点和点的距离基本是保持一致的,并且是均匀的。通过这个「神奇」的方法,我们终于画出了平滑且均匀的曲线。五、绘画板功能实现终于讲完了最麻烦的部分,接下来简单介绍一下绘画板基本功能的实现。1、颜色混合在以往的例子中,我们在开始一次渲染之前,都会调用glClear(GL_COLOR_BUFFER_BIT)来清除画布,因为我们不希望保留上次的渲染结果。但是对于一个绘画板来说,我们要不断地往画布上画东西,所以是希望保留上次结果的。因此,在绘制之前不能执行清除的操作。另外,由于我们的画笔可能是半透明的,所以新绘制的颜色需要和画布上已经存在的颜色进行混合。因此在绘制开始之前,需要开启混合选项。2、笔触调整笔触有3个属性可以调整:颜色、尺寸、形状。它们本质上都是对点图元的调整,通过uniform变量的形式,将颜色、尺寸、纹理传入着色器并应用。3、橡皮擦GLPaintView在初始化的时候,需要传入一个背景色参数,当用户切换到橡皮擦功能的时候,内部只是单纯地将画笔的颜色切换成背景色,于是就产生了橡皮擦的效果。4、撤销重做撤销重做功能需要依赖两个栈来实现。我们把用户的手指从按下屏幕到离开屏幕这一过程中产生的数据,定义为一个操作对象,这个操作对象保存了归一化后的点序列,以及点的属性

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论