1. 程式人生 > >iOS下OpenGL ES 3.0程式設計入門(一):構建Hello World環境

iOS下OpenGL ES 3.0程式設計入門(一):構建Hello World環境

OpenGL ES簡介:

     OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式裝置而設計。該API由Khronos集團定義推廣,Khronos是一個圖形軟硬體行業協會,該協會主要關注圖形和多媒體方面的開放標準。

OpenGL ES 3.0主要新功能有: 1、渲染管線多重增強,實現先進視覺效果的加速,包括遮擋查詢(Occlusion Query)、變緩反饋(Transform Feedback)、例項渲染(Instanced Rendering)、四個或更多渲染目標支援。 2、高質量ETC2/EAC紋理壓縮格式
成為一項標準功能,不同平臺上不再需要需要不同的紋理集。 3、新版GLSL ES 3.0著色語言,全面支援整數和32位浮點操作。 4、紋理功能大幅增強,支援浮點紋理、3D紋理、深度紋理、頂點紋理、NPOT紋理、R/RG單雙通道紋理、不可變紋理、2D陣列紋理、無二次冪限制紋理、陰影對比、調配(swizzle)、LOD與mip level clamps、無縫立方體貼圖、取樣物件、紋理MSAA抗鋸齒渲染器。 5、一系列廣泛的精確尺寸紋理和渲染緩衝格式,便攜移動應用更簡單。      而在iOS上,可以支援opengles3.0的最低環境是iphone5s ios7.0.

iOS下環境搭建:

     關於ios下環境搭建有好幾種,最簡單的是在新建工程的時候選擇game模板,然後如下圖所示:


     不過,用這種方式,創建出來的工程有很多用不到的程式碼,不利於我們one by one的學習,所以,我們就從最簡單的single view application工程說起,怎麼一步步去搭建opengl es環境。

     首先,建立一個single view application工程,然後,引入GlKit和OpenGLES。



     緊接著,在ViewController.h檔案裡引入GLKit/GLKit.h,將ViewController類的父類改成GLKViewController。

#import <UIKit/UIKit.h>
#import <GLKit/GLKit.h>
@interface ViewController : GLKViewController


@end

     然後將storyboard中ViewController所對應的view的Custom Class改成GLKView。


     修改ViewController.m檔案,程式碼如下:

#import "ViewController.h"
#import <OpenGLES/ES3/gl.h>
#import <OpenGLES/ES3/glext.h>
@interface ViewController ()<GLKViewDelegate>
{
    EAGLContext *context; //EAGLContent是蘋果在ios平臺下實現的opengles渲染層,用於渲染結果在目標surface上的更新。

}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];//這裡用的是opengles3.
    
    if (!context) {
        NSLog(@"Failed to create ES context");
    }
    
    GLKView *view = (GLKView *)self.view;
    view.context = context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    [EAGLContext setCurrentContext:context];
    glEnable(GL_DEPTH_TEST); //開啟深度測試,就是讓離你近的物體可以遮擋離你遠的物體。
    glClearColor(0.1, 0.2, 0.3, 1); //設定surface的清除顏色,也就是渲染到螢幕上的背景色。
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //清除surface內容,恢復至初始狀態。
}
@end

     再次構建執行,如下圖所示:


     至此,一個初步的opengles3的開發環境已經搭建完畢,因為ios平臺的特殊性,所以我們很多時候不得不借助ios下glkit庫去實現和簡化我們的操作,不過,對於大部分opengles的內容,我還是會脫離glkit,原汁原味的道出,這樣,對於以後的跨平臺是大有裨益的。

     本文有不足之處,還望各位多多指正。