2010-11-10 3 views
0

У меня очень странный глюк в моем приложении ipad. Это очень просто: я просто использую обработчик «touchhesMoved», чтобы нарисовать линию между двумя точками. Поскольку я хотел бы, чтобы строки оставались на экране, я не называю «glClear» в моей функции рисования, но по какой-то причине некоторые из строк просто выпадают, и это кажется совершенно случайным. Еще страннее, он отлично работает в симуляторе. Кто-нибудь знает, почему это может быть? Я включил мои прикосновения и рисовал процедуры.GL_LINES рисуется беспорядочно (iPad + OpenGL ES1)

Большое спасибо!

Пит

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSSet *allTouches = [event allTouches]; 
    switch ([allTouches count]) 
    { 
     case 1: 
     { //Single touch 
     } break; 
     case 2: 
     { //Double Touch 
      UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0]; 
      CGPoint location1 = [touch1 locationInView: [touch1 view]]; 
      UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1]; 
      CGPoint location2 = [touch2 locationInView: [touch2 view]]; 

      [self drawLineWithStart:location1 end:location2]; 
     } break; 
     default: 
      break; 
    } 
} 


- (void)drawLineWithStart:(CGPoint)start end:(CGPoint) end 
{ 
    [EAGLContext setCurrentContext:context]; 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 

    GLfloat lineVertices[] = 
    { 
     (start.x/(768.0/2.0)) - 1.0, -1.5 * ((start.y/(1024.0/2.0)) - 1.0), 
     (end.x/(768.0/2.0)) - 1.0, -1.5 * ((end.y/(1024.0/2.0)) - 1.0) 
    }; 

    glDisable(GL_TEXTURE_2D); 

    // Render the vertex array 
    glVertexPointer(2, GL_FLOAT, 0, lineVertices); 
    glDrawArrays(GL_LINE_STRIP, 0, 2); 

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

ответ

0

В зависимости от ситуации вы также можете сохранить подложку. Это решит вашу проблему здесь, но будет стоить вам производительности.

В вашем OpenGLES2DView.m измените kEAGLDrawablePropertyRetainedBacking на YES. Он будет выглядеть следующим образом:

 eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; 

Но повторим, это будет стоить производительности, однако я хотел бы сказать, если вы пытаетесь написать приложение для рисования (от взглядов его) это может быть то, что вы ищете , Поскольку при рисовании приложений не рекомендуется повторно запускать логику, чтобы перерисовывать каждый кадр, это хорошее решение.

+0

Большое спасибо, что сработало отлично! – Pete

1

Этот код делает presentRenderBuffer в двойном забуференном контексте без ясной. Это означает, что его чертеж в один буфер, его представление, рисование на другой буфер, представление его и т. Д. В результате ни один видимый буфер не имеет всего чертежа линии, а своп (присутствует) будет показывать различия в переменных буферах. Схема двойной буферизации симулятора отличается от физических устройств, которые объясняют разницу, которую вы видите.

Накопите линии в структуре данных. Каждый кадр очищает, затем рисует все линии.

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