Iphone OpenGL ES:在像素绘制应用程序中撤消

Iphone OpenGL ES:在像素绘制应用程序中撤消,iphone,xcode,opengl-es,pixel,undo,Iphone,Xcode,Opengl Es,Pixel,Undo,我目前正在开发一个应用程序,允许用户使用OpenGL ES绘制像素图像,但我不知道如何实现撤销功能。 我怎么做呢?我想对每个像素使用一个图像,并将其添加到一个数组中。基本上,如何将使用的矩形存储为像素 how can I store the rectangles I use as pixels? 我不确定你的基本设置是否正确。你应该使用一个大的纹理作为画布。任何用户绘制操作都应仅影响该纹理(您将使用glTexSubImage2D更新该纹理)。然后在每一帧上,你都应该在屏幕上重新绘制这个纹理 一

我目前正在开发一个应用程序,允许用户使用OpenGL ES绘制像素图像,但我不知道如何实现撤销功能。 我怎么做呢?我想对每个像素使用一个图像,并将其添加到一个数组中。基本上,如何将使用的矩形存储为像素

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 
  • 清除旧的
    缓冲区

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
     [context presentRenderbuffer:GL_RENDERBUFFER_OES];
    
  • 数组中删除点

    for (int i = 0; i < 50; ++i)
    {
    [self.vertexBuffers removeLastObject];
    }
    
  • 显示
    缓冲区

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
     [context presentRenderbuffer:GL_RENDERBUFFER_OES];
    
  • 其他解决方案: 您可以在每次绘图时从OpenGL ES上下文中获取图像,并将其作为图像文件保存在应用程序包中。这样可以节省应用程序的运行内存。 按下“撤消”按钮时,只需将先前保存的图像绘制到上下文中即可


    请参见

    Undo通常只删除最后一个操作。为什么要调用RemovelAsObject 50次?有人在OpenGL ES 2上做过这项工作吗?我让它在ES 1上工作,但是当我把它复制到ES 2上时,它就不工作了。我很确定这与重新渲染缓冲区有关(3美元和4美元以上)。任何人都能提供一些见解。当它重新渲染时,它不会绘制所有的绘画,但只绘制了几个点。。。