2011-06-08 82 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個紋理/畫布的圓形列表。