2011-11-24 81 views
0

我是iOS中OpenGL ES编程的绝对初学者。iPhone上的OpenGL ES没有绘制任何东西

这是我第一次尝试使用OpenGL ES在视图上绘制一些简单的2D图元。

这里是类的声明:

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

这里是我的初始化代码:

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

} 

和我的绘图代码:

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

} 

画布被清除(事实上,它变成黑色,或红色,或者我设置为glClearColor的任何东西),但不绘制点。

我很确定我忘记了一些基本的和必不​​可少的东西。

感谢您的帮助。

回答

2

的问题是在这里:

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

归一化装置在坐标范围内奠定[-1..1]所以你画他们的可见区域之外。

而这里:

你必须在绘图之前这样做。

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
+0

谢谢。移动我的第一步......我仍然不理解变换矩阵背后的整个概念。我玩他们,但是,例如,我不能集中“设备坐标”的概念...... – gd1

+0

嗯,你真的只需要时间和实践来理解所有这些东西。我建议你从理解数学开始,因为它对图形至关重要。请阅读本书:http://books.google.com/books/about/Mathematics_for_3D_game_programming_and.html?id=bfcLeqRUsm8C – Max