2012-08-07 2 views
3

У меня проблема с GLKit в проекте, похожем на GLPaint.GLPaint с GLKit: мерцание при рисовании

Прежде всего, я не использую GLKViewController, но только GLKView, который добавлен в мой класс.

Моя проблема в том, что когда я рисую свой GLKView, содержимое мерцает. Похоже, что я рисовал в определенном буфере кадров в первом вызове drawKect GLKViewDelegate, и следующий вызов был другим буфером кадров, затем следующий вызов вернулся к первому и т. Д. Я протестировал эту возможность, и это похоже, не так, как буфер визуализации, так и буфер кадров одинаковы во всем чертеже.

Вот как мой рисунок работа (аналогичный GLPaint образец код):

На сенсорных событиях, я называю renderStroke создавать точки, которые используются в чертеже, чтобы применить текстуры и представить линию. Я использую пользовательские шейдеры, поэтому я устанавливаю буфер, содержащий эти пункты в заранее оговоренном месте, поэтому шейдер имеет доступ к нему:

// Give the vertex positions to the vertex shader 
glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, 0, 0, vertexBuffer); 
glEnableVertexAttribArray(ATTRIB_POSITION); 

Затем в методе дро, я называю glDrawArrays:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 
    glDrawArrays(GL_POINTS, 0, self.verticesCount); 
} 

Вот как я инициализировать GLKView:

self.glView = [[GLKView alloc] initWithFrame:self.frame]; 
self.glView.context = _context; 
self.glView.delegate = self; 
self.glView.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888; 
self.glView.drawableStencilFormat = GLKViewDrawableStencilFormat8; 
self.glView.enableSetNeedsDisplay = NO; 
self.glView.userInteractionEnabled = NO; 
[self addSubview:self.glView]; 

текстура, матрица modelViewProjection кажется работать правильно, так как я вижу правильную текстуру применительно к каждой точке.

Я искал способы отладки этого, но все, что я видел, казалось нормальным. Есть что-то, что мне не хватает?

Спасибо!

EDIT:

Я задаюсь вопросом, когда DrawRect называется, является color_render_buffer и stencil_buffer означало быть очищены перед дальнейшим рисунок делается? Моя цель здесь - сохранить рисунок, который я сделал ранее, и нарисовать другой контент поверх него. Без GLKit это обычно делается с помощью kEAGLDrawablePropertyRetainedBacking. Я установил его на слой glView, используя:

CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) self.glView.layer; 
eaglLayer.opaque = NO; 
eaglLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking : @(YES)}; 

Это, похоже, не работает.

+0

Удачи вам в этом? – Joe

+0

Нет, вы можете проверить эту тему, которую я создал на форуме apple, где я описываю некоторые из моих проблем с проблемой. Вот ссылка: [https://devforums.apple.com/thread/162592?tstart=15] – ebp

+0

Этот ответ работает: http://stackoverflow.com/questions/9395743/glkview-set-drawable-properties/ 13684498 # 13684498 – aoakenfo

ответ

0

Является ли glClear() выполнением буферов цветов и глубины на каждом перерисовании кадра? Я не вижу этого в коде выше.

+0

Нет Я не использую glClear() при каждом перерисовке. Если бы я это сделал, это действительно очистило бы все, что я сделал до сих пор, но это не так. Я хочу сохранить то, что находится в фреймбуфере, и добавить новый чертеж. – ebp

+0

Ну, тогда я думаю, что вы должны рисовать в переднем буфере и выдавать glFlush(), предполагая, что окно двойным буферизируется. –

+0

Хммм Я не уверен, что понимаю, как это будет сделано с помощью glKit. Есть ли способ рисовать конкретно в переднем буфере? – ebp

Смежные вопросы