GL_LINES работает беспорядочно (iPad + OpenGL ES1) - PullRequest
0 голосов
/ 10 ноября 2010

Я испытываю действительно странный сбой в своем приложении для iPad.Это очень просто: я просто использую обработчик touchesMoved, чтобы нарисовать линию между двумя точками.Поскольку я хотел бы, чтобы линии оставались на экране, я не вызываю «glClear» в своей функции рисования, но по некоторым причинам некоторые линии просто выпадают, и это выглядит совершенно случайно.Как ни странно, он отлично работает в симуляторе.Кто-нибудь знает, почему это может быть?Я включил мои процедуры касания и рисования.

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

Пит

-(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];
}

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

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

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

0 голосов
/ 10 ноября 2010

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

В вашем OpenGLES2DView.m измените kEAGLDrawablePropertyRetainedBacking на YES. Это будет выглядеть так:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...