2011-06-08 49 views
0

我目前正在研究一个允许用户使用OpenGL ES绘制像素化图像的应用程序,但我不知道如何实现撤消功能。 我该怎么办?我想为每个像素使用图像并将其添加到数组中。基本上,我如何存储我用作像素的矩形?OpenGL ES:在像素绘画应用程序中撤消

回答

1

你可以试试:

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 
  1. 清除旧buffer

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    
  2. 删除点从array;

    for (int i = 0; i < 50; ++i) 
    { 
    [self.vertexBuffers removeLastObject]; 
    } 
    
  3. 渲染

    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); 
    } 
    
  4. 显示buffer

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
    

其他的解决办法: 你可以抓住从OpenGL ES的背景图像每次你画的东西,并保存在应用程序的捆绑作为图像文件。这节省了应用程序的运行内存。 按下撤消按钮时,只需将上一个保存的图像绘制到上下文中,就是这样。

OpenGL ES Simple Undo Last Drawing

+0

撤消删除,通常最后一个动作only.Why你叫removeLastObject 50倍? – 2012-07-19 00:37:22

+0

有没有人在OpenGL ES 2上做过这项工作?我有它在ES 1上工作,但是当我将它复制到ES 2时,它不起作用。我很确定它与缓冲区的重新渲染(上面的#3和$ 4)有关。任何人都能提供任何见解。当它重新渲染它不会画出所有的颜料,但只有几点... – 2013-11-18 17:32:24

2
how can I store the rectangles I use as pixels? 

我不确定你是否拥有基本的设置权限。你应该使用一个大纹理作为画布。任何用户绘画操作都应该只影响这个纹理(你将用glTexSubImage2D更新)。然后在每一帧你都应该在屏幕上重绘这个纹理。

简单的N步撤消系统将包含N个纹理/画布的圆形列表。