OpenGL ES: отменить в приложении Pixel Painting - PullRequest
0 голосов
/ 08 июня 2011

В настоящее время я работаю над приложением, которое позволяет пользователю рисовать пиксельные изображения с помощью OpenGL ES, но я не знаю, как реализовать функцию отмены. Как я мог это сделать? Я думал об использовании изображения для каждого пикселя и добавлении его в массив. Как я могу хранить прямоугольники, которые я использую как пиксели?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011
how can I store the rectangles I use as pixels?

Я не уверен, что вы правильно настроили базовую настройку.Вы должны использовать большую текстуру, действующую как холст.Любые пользовательские операции рисования должны влиять только на эту текстуру (которую вы будете обновлять с помощью glTexSubImage2D).Затем в каждом кадре вы должны перерисовывать эту текстуру на экране.

Простая система отмены N-шагов будет состоять из кругового списка из N текстур / полотен.

0 голосов
/ 19 марта 2012

Вы можете попробовать:

    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 Простая отмена последнего рисования

...