iPhone OpenGL ES项目基本模型

本文介绍了如何在iPhone应用中使用OpenGL ES进行基本的图形处理。从创建基于UIView的自定义类开始,通过添加必要的框架,重载layerClass方法,设置绘制环境,启用或禁用特定功能,创建和删除帧缓冲区,最终实现OpenGL ES的基础模型搭建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       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为基础的模型就这样了..具体的绘制我们都努力去学习吧.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值