GL_LINES绘图不规律(iPad + OpenGL ES1)

时间:2010-11-10 00:05:52

标签: objective-c ipad opengl-es

我在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 个答案:

答案 0 :(得分:1)

此代码在双缓冲上下文中执行presentRenderBuffer而没有清除。这意味着它绘制到一个缓冲区,呈现它,绘制到另一个缓冲区,呈现它等。因此,没有一个可见缓冲区具有所有线条绘制,交换(存在)将显示交替缓冲区中的差异。模拟器双缓冲方案与解释您所看到的差异的物理设备不同。

累积数据结构中的行。每个框架都清除然后绘制所有线条。

答案 1 :(得分:0)

根据具体情况,您也可以保留支持。这将解决您的问题,但会降低您的性能。

在OpenGLES2DView.m中将kEAGLDrawablePropertyRetainedBack更改为YES。它看起来像这样:

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

但重申一下,它会耗费性能,不过我会说如果你正在尝试编写一个绘图应用程序(从外观上看)它可能就是你要找的东西。由于在绘制应用程序时,重新运行逻辑以重绘每一帧并不是一个好主意,这是一个很好的解决方案。