简体   繁体   中英

OpenGL ES on iPhone doesn't draw anything

I'm an absolute beginner in OpenGL ES programming in iOS.

This is my first attempt to draw some simple 2D primitives with OpenGL ES onto a view.

Here is the class declaration:

@interface OGLGameCanvas : UIView <GameCanvas> {
    EAGLContext* context;
    Game* game;
    GLuint framebuffer, renderbuffer, depthbuffer;
}

Here is my initialization code:

- (void)initialize {

    // Get the layer and set properties

    CAEAGLLayer* layer = (CAEAGLLayer*)self.layer;

    layer.opaque = NO;
    layer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];


    // Set the context

    context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

    if (!context || ![EAGLContext setCurrentContext:context])
        DLog(@"Cannot create EAGLContext!");


    // Create the color buffer and the render buffer

    glGenFramebuffers(1, &framebuffer);
    glGenRenderbuffers(1, &renderbuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);

    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)layer];
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if (status != GL_FRAMEBUFFER_COMPLETE)
        NSLog(@"Failed to make complete frame buffer: %x", status);


    // Get width and height of the render buffer

    GLint width, height;
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height); 

    // Create and start animation loop

    CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawFrame:)];
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

}

and my drawing code:

- (void)drawFrame:(CADisplayLink*)sender {

    glLoadIdentity();
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnableClientState(GL_VERTEX_ARRAY);
    GLfloat vertices[] = { -20.0f, 2.5f, 0.0f, 0.0f, 1.5f, 7.5f };
    glVertexPointer(2, GL_FLOAT, 0, vertices);
    glColor4f(1.0, 0.0, 0.0, 1.0);
    glPointSize(5.0);
    glDrawArrays(GL_POINTS, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);

    [context presentRenderbuffer:GL_RENDERBUFFER];

}

The canvas gets cleared (in fact, it becomes black, or red, or whatever I set into glClearColor), but no points are drawn.

I'm pretty sure I'm forgetting something basic and essential.

Thanks for your help.

The problem is here:

GLfloat vertices[] = { -20.0f, 2.5f, 0.0f, 0.0f, 1.5f, 7.5f };

The normalized device coordinates lay in range [-1..1] so you're drawing them outside the visible area.

And here:

You have to do this before drawing.

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM