gd1
gd1

Reputation: 11403

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.

Upvotes: 0

Views: 829

Answers (1)

Max
Max

Reputation: 16709

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();

Upvotes: 2

Related Questions