iPhone OpenGL ES項目基本模型

來源:互聯網
上載者:User

       OpenGL在普通PC機編程中是非常有用且通用的一種庫.而對於嵌入式裝置則需要使用其精簡庫,稱之OpenGL ES.當然在這裡要寫這篇文章不是因為自己已經懂它的使用.而是自己正在瞭解一些關於它的基本使用.

     現在開始我們的基本處理了...

我們只需要在選擇View-Based Application來建立一個基於iphone的工程就可以了.沒有必要一需要提供的架構.好了,繼續建立好我們的工程吧..

好了,趕緊添加的兩個架構吧.接下來我們要開始我們的代碼工作了...

先建立一個基於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為基礎的模型就這樣了..具體的繪製我們都努力去學習吧.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.