1

Apple 徒手画GLPaint的例子,使用 OpenGL ES 绘画不能用大框架绘制。我需要在大画布上绘制超过 {2410, 1808} 的内容。但是当我尝试绘图时,控制台上会显示一条消息,

2012-06-05 14:29:40.780 GLPaint [3390:707] 绘图视图框架:{{-827.222, -567.004}, {2410, 1808}}
2012-06-05 14:29:40.884 GLPaint [3390:707] 无法制作完整的帧缓冲区对象 8cd6

在我的代码中,我将框架设置为-

//PaintingViewGL performing the freehand drawing of OpenGL ES
//drawingView is a UIView with dynamic frame size

paintingViewGL = [[PaintingViewGL alloc] initWithFrame:drawingView.frame];
paintingViewGL.backgroundColor = [UIColor clearColor];

[drawingView addSubview:paintingViewGL];
paintingViewGL.center = drawingView.center;
paintingViewGL.hidden = NO;

我在帧大小 {1435, 1076} 和稍大一点的帧(如 {1600, 1200})上得到了不错的结果,画笔像波浪一样消失并开始在屏幕上跳舞。有时我会收到 Received memory 警告。在这种情况下,Level=1。

4

2 回答 2

3

对于 iPad 2 之前的设备,最大纹理大小为 2048 x 2048,因此您不能绘制大于该大小的纹理或帧缓冲区对象。您只会看到错误和黑屏。在较新的设备(iPad 2、Retina iPad、iPhone 4S)上,此纹理大小限制已增加到 4096 x 4096。

在更大的画布上绘图的唯一解决方案是在 OpenGL ES 中创建平铺机制,就像 CATiledLayer 在 Core Animation 中所做的那样。不过,祝您好运,因为如果您对 OpenGL ES 渲染不太熟悉,这将是一项重大任务。

此外,您将在 OpenGL ES 中遇到非常大的场景的内存问题,尤其是在较旧的 iOS 设备上。对于您提到看到警告的 1600x1200 图像,每个未压缩的帧本身占用约 7.7 MB 的内存。如果您有多个图层或纹理,如果您不小心,可能会很快加起来并耗尽设备上的可用内存。对于 2410x1808 图像,您现在看到的是每帧 17.4 MB,因此这是您希望平铺它以仅使用您当时需要的平铺的另一个原因。

于 2012-06-07T14:28:42.903 回答
0

这件事的大小上限与纹理相同。当前上限为 1<<11 (2048),您不能创建宽度或高度大于 2048 像素的缓冲区。我看到达到您想要的效果的唯一方法是创建超过 1 个视图或超过 1 个帧缓冲区。如果您真的想要/需要经历所有这些麻烦,请阅读有关 FBO(帧缓冲区对象)的内容。

于 2012-06-07T13:34:07.700 回答