【问题标题】:zoom in the GLPaint sample code放大 GLPaint 示例代码
【发布时间】:2013-05-23 16:07:43
【问题描述】:

我想制作一个应用程序,您可以在其中像 GLPaint 示例代码一样进行绘画,但也可以放大以在绘画中更详细地绘画。 但我有一种感觉,使用 GLPaint 应用程序中使用的 OpenGL ES 1.0 很难学习,而且对于我的需要来说可能有点矫枉过正。 如果我使用 setFrame 方法更改主视图框架以使用手势识别器进行缩放,则每次更改框架大小都会擦除已绘制的线条。

所以我尝试用另一个想法来实现它:在 touchmoves 方法中,我在“许多”位置添加了带有画笔图像的 uiimageviews,它比 glpaint 应用程序慢,而且内存管理有点混乱,但是我没有看到其他方式去那里。

任何建议,学习 openGL ES 1.0 或 2.0 或尝试实现最后一个想法

【问题讨论】:

    标签: iphone opengl-es


    【解决方案1】:

    你当然可以实现你正在做的事情,但这需要一些努力。

    通常缩放非常简单,因为大多数 OpenGL 场景通常不像 GLPaint 示例代码那样依赖累积缓冲区。

    如果您尝试仅在 GLPaint 中缩放视图,您的新绘画将以调整后的比例绘制在原始绘画之上 - 这几乎肯定不是您想要的。

    解决方法不是直接绘制到您的呈现屏幕缓冲区,而是首先渲染到纹理缓冲区,然后在四边形(或等效)上渲染所述纹理缓冲区。这样,在您的绘制缓冲区保留其累积缓冲区时,可以在每次帧刷新(以您选择的任何比例)时清除并重新渲染四边形场景。

    这已经过测试并且有效。

    【讨论】:

      【解决方案2】:

      我很确定图像视图方法在绘制几分钟后会有点过分……你可以用 openGL 很好地完成所有缩放,我建议你这样做。最好的做法是创建一个尽可能大的画布,以便在放大时不会丢失任何分辨率。

      关于缩放:不要尝试调整 GL 框架或任何框架的大小,因为即使你成功地做到了,你也会失去分辨率。您应该使用标准矩阵来转换和缩放场景,或者只是使用glOrtho(将其值设置为您当前看到的矩形)。一旦你得到了那个部分,还有两件事需要做一些数学运算,首先是你必须计算openGL场景中的新触摸位置,因为视图中的位置不会知道你的缩放和平移,其次是您可能还需要缩放画笔(当场景较大时缩小画笔以便绘制细节)。

      关于画布:我确实建议您绘制到 FBO 而不是您的主渲染缓冲区,并将纹理呈现给您的主渲染场景。请注意,FBO 将附加纹理并且大小为 2 的幂(为较新的设备创建 2048x2048 或 4096x4096)但您可能只是使用其中的一部分来保持与屏幕相同的比例(glViewport 应该做这项工作)所以你将不得不计算纹理坐标。总体来说绘制机制变化不大。

      总而言之,假设您有一个画布 (FBO),您在触摸事件上应用特定大小和位置的画笔,然后将该画布用作纹理并在主 GL 视图上绘制它。

      【讨论】:

      • 投了反对票,因为您不能像建议的那样简单地缩放,因为 GLPaint 代码取决于每次重绘都会清除的累积缓冲区。
      • 我相信您对 GLPaint 的看法是正确的,但我几乎不在乎一个简单的示例项目是如何工作的。我不建议修改该示例项目,而是创建一个旨在满足您需求的新项目。但是,如果您只是在重绘时禁用缓冲区的清除或创建一个事件缓冲区,可用于在清除后重绘场景。无论如何,这完全超出了这个问题的范围,这似乎是关于像 GLPaint 这样的应用程序。所以如果你有兴趣做这样一个项目,你应该知道它通常比复制样本需要更多的时间。
      • 我没有问这个问题,我没有问题。我刚刚发现你的答案不正确,我不希望它把任何人引向错误的方向。
      • 还说您不关心 GLPaint 与说您实际上不关心回答问题是一样的,因为这就是这个问题的意义所在。
      • 那我们可能对这个问题有不同的看法。我仍然认为您的论点无效,但正如您所说,其他人可能会觉得它有帮助。由于我看到您不同意答案,因此如果引入了一个好的解决方案,我很乐意为您的答案投票。
      猜你喜欢
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多