现在的位置: 首页 > 综合 > 正文

iPhone OpenGL ES项目基本模型

2013年09月07日 ⁄ 综合 ⁄ 共 3558字 ⁄ 字号 评论关闭

       OpenGL在普通PC机编程中是非常有用且通用的一种库.而对于嵌入式设备则需要使用其精简库,称之OpenGL ES.当然在这里要写这篇文章不是因为自己已经懂它的使用.而是自己正在了解一些关于它的基本使用.

     现在开始我们的基本处理了...

我们只需要在上图选择View-Based Application来创建一个基于iphone的工程就可以了.没有必要一需要提供的框架.好了,继续创建好我们的工程吧..

Frame

好了,赶紧添加如图的两个框架吧.接下来我们要开始我们的代码工作了...

先创建一个基于UIView的类吧.并把他加载到创建工程的ViewController上去吧.这样我们就可只在我们自定义的View上进行操作了(比如我的就创建了一个glView类).快点噢...有些操作我们这里就省了(比如头文件的包含)...

接下来,开始我们真正的OpenGL ES工作了.

在glView.h文件中定义个几个成员变量,具体如下图:

然后,进入glView.m文件中去吧.

这里我们首先重载一个类

+(Class)layerClass {
    return [CAEAGLLayer class];
}

接下来,我们进入初始化函数中去吧:

+(Class)layerClass {
    return [CAEAGLLayer class];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
//        displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkView)];
//        [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
        CAEAGLLayer *eagllayer = (CAEAGLLayer *)self.layer;
        eagllayer.opaque = YES;
        eagllayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat, nil];
        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
        
        if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) {
            [self release];
            return nil;
        }
        glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFamebuffer);
        glViewport(0.0, 0.0, backingWidth, backingHeight);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrthof(0.0, self.frame.size.width, 0.0, self.frame.size.height, -1.0, 1.0);
        glMatrixMode(GL_MODELVIEW);
        glClearColor(1.0, 1.0, 1.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);
        
        glEnableClientState(GL_VERTEX_ARRAY);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewFamebuffer);
        [context presentRenderbuffer:GL_RENDERBUFFER_OES];
        glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
        glEnable(GL_TEXTURE_2D);
        glEnableClientState(GL_VERTEX_ARRAY);
        
        
    }
    return self;
}

代码如上述,在这里我们需要做的就是设置绘制环境,开启或者禁用一些功能.

上面我们用到了一个函数其实现如下:

- (BOOL)createFramebuffer {
    
    glGenFramebuffersOES(1, &viewFamebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);
    
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFamebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
    
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
    NSLog(@"%d,%d,%d,%d",viewFamebuffer,viewRenderbuffer,backingWidth,backingHeight);
    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
        return NO;
    }
    
    return YES;
}
这样,我们的设置就做好了,现在我们需要做的就是根据我们的需要进行OpenGL ES的图形处理操作了.当然,在我们结束的时候记得要对绘制环境和OpenGL ES的状态机进行删除处理.代码大致为:

- (void)deleteFramebuffer
{
    if (context) {
        [EAGLContext setCurrentContext:context];
        
        if (defaultFramebuffer) {
            glDeleteFramebuffers(1, &defaultFramebuffer);
            defaultFramebuffer = 0;
        }
        
        if (colorRenderbuffer) {
            glDeleteRenderbuffers(1, &colorRenderbuffer);
            colorRenderbuffer = 0;
        }
    }
}

[context release];

好了,一个以OpenGL ES为基础的模型就这样了..具体的绘制我们都努力去学习吧.

抱歉!评论已关闭.