【发布时间】:2011-09-11 00:38:52
【问题描述】:
我目前正在开发一个允许用户使用 OpenGL ES 绘制像素化图像的应用程序,但我不知道如何实现撤消功能。 我怎么能做到?我想为每个像素使用一个图像并将其添加到一个数组中。基本上,我怎样才能将我使用的矩形存储为像素?
【问题讨论】:
标签: iphone xcode opengl-es pixel undo
我目前正在开发一个允许用户使用 OpenGL ES 绘制像素化图像的应用程序,但我不知道如何实现撤消功能。 我怎么能做到?我想为每个像素使用一个图像并将其添加到一个数组中。基本上,我怎样才能将我使用的矩形存储为像素?
【问题讨论】:
标签: iphone xcode opengl-es pixel undo
how can I store the rectangles I use as pixels?
我不确定您的基本设置是否正确。您应该使用大纹理作为画布。任何用户绘画操作都应该只影响这个纹理(您将使用 glTexSubImage2D 更新)。然后在每一帧你都应该在屏幕上重绘这个纹理。
一个简单的 N 步撤消系统将包含 N 个纹理/画布的循环列表。
【讨论】:
你可以试试:
NSData *data = [NSData dataWithBytes:vertexBuffer length:vertexCount * sizeof(GL_FLOAT) * 2] ;
if (self.vertexBuffers == nil) self.vertexBuffers = [[NSMutableArray alloc] init];
[self.vertexBuffers addObject:data];
save every draw point to a array;
if undo
清除旧的buffer
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
从array;删除点
for (int i = 0; i < 50; ++i)
{
[self.vertexBuffers removeLastObject];
}
渲染
for (NSData *point in self.vertexBuffers)
{
NSUInteger count = point.length / (sizeof(GL_FLOAT) * 2);
glVertexPointer(2, GL_FLOAT, 0, point.bytes);
glDrawArrays(GL_POINTS, 0, count);
}
显示buffer
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
其他解决方案: 每次绘制内容时,您都可以从 OpenGL ES 上下文中获取图像并将其保存为应用程序包中的图像文件。这节省了应用程序的运行内存。 当按下撤消时,您只需将之前保存的图像绘制到上下文中即可。
【讨论】: