0

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

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

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

4

2 回答 2

0

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

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

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

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

这已经过测试并且有效。

于 2015-06-07T17:56:19.297 回答
-1

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

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

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

所以总结一下,假设你有一个画布(FBO),你在触摸事件上应用特定大小和位置的画笔,然后你使用该画布作为纹理并将其绘制在你的主 GL 视图上。

于 2013-05-24T07:30:00.313 回答