OpenGLES-01 渲染第一步

若文章讀完微服,請(qǐng)多練習(xí)文章里函數(shù)的寫法鄙才。
1.創(chuàng)建你的項(xiàng)目并新建MyGLView

新建MyGLView.png

2.修改你創(chuàng)建的MyGLView添加如下變量(變量后面會(huì)有介紹)

@interface MyGLView ()
{
    CAEAGLLayer *_eaglLayer;  //OpenGL內(nèi)容只會(huì)在此類layer上描繪
    EAGLContext *_context;    //OpenGL渲染上下文
    GLuint _renderBuffer;     //
    GLuint _frameBuffer;      //

}

3.在 MyGLView.m 中添加如下函數(shù):

+(Class)layerClass{
    //OpenGL內(nèi)容只會(huì)在此類layer上描繪
    return [CAEAGLLayer class];
}

因?yàn)镺penGLES的描繪必須在CAEAGLLayer上才能顯示出來,所以我們需要重寫這個(gè)函數(shù)择诈,修改view默認(rèn)的layer返回類型

4.設(shè)置_eaglLayer的屬性出皇,添加如下函數(shù):

- (void)setupLayer
{
    _eaglLayer = (CAEAGLLayer*) self.layer;
    
    // CALayer 默認(rèn)是透明的,透明對(duì)性能影響大荷科,設(shè)置為不透明對(duì)性能最好
    _eaglLayer.opaque = YES;
    
    // 設(shè)置描繪屬性纱注,在這里設(shè)置不維持渲染內(nèi)容以及顏色格式為 RGBA8
    _eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
}

5.設(shè)置渲染上下文 _context 屬性狞贱,添加如下函數(shù):

- (void)setupContext {
    // 指定 OpenGLES 渲染API的版本瞎嬉,在這里我們使用OpenGLES 3.0氧枣,由于3.0兼容2.0并且功能更強(qiáng)扎谎,為何不用更好的呢
    //注:在iOS上,可以支持opengles3.0的最低環(huán)境是iphone5s ios7.0.
    EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES3;
    _context = [[EAGLContext alloc] initWithAPI:api];
    if (!_context) {
        NSLog(@"Failed to initialize OpenGLES 3.0 context");
    }
    
    // 設(shè)置為當(dāng)前上下文
    [EAGLContext setCurrentContext:_context];
}

6.設(shè)置 _renderBuffer烧董,添加如下函數(shù):

-(void)setupRenderBuffer{
    glGenRenderbuffers(1, &_renderBuffer); //
    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
    [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
}

7.設(shè)置 _frameBuffer,添加如下函數(shù):

-(void)setupFrameBuffer{
    glGenFramebuffers(1, &_frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);
}

8.buffer介紹

1). buffer分為frame buffer和render buffer兩大類,其中frame buffer相當(dāng)于render buffer的管理者,frame buffer object即稱為FBO,常用于做離屏渲染緩沖等廷粒。render buffer則又可分為三類坝茎,color buffer / depth buffer / stencil buffer思喊。

2). 生成frame buffer object的API函數(shù):
 glGenFramebuffers(1, &framebuffer);
 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
生成render buffer的API函數(shù)岳服,render buffer的生成函數(shù)是一樣的,buffer句柄類型只有在進(jìn)行分配buffer空間的時(shí)候才會(huì)確定:
glGenRenderbuffers(1, &renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);

3). frame buffer僅僅是管理者纲辽,不需要分配空間腺劣;render buffer的存儲(chǔ)空間的分配,對(duì)于不同的render buffer芋酌,使用不同的API進(jìn)行分配,而只有分配空間的時(shí)候脐帝,render buffer句柄才確定其類型
(1). 最基本的是color buffer同云,調(diào)用EGALContext的OC方法為其分配空間
/* Attaches an EAGLDrawable as storage for the OpenGL ES renderbuffer object bound to <target> */
- (BOOL)renderbufferStorage:(NSUInteger)target fromDrawable:(id<EAGLDrawable>)drawable;
(2). 而depth buffer則可以直接調(diào)用openGL本身的API進(jìn)行分配
glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT16, width, height);

4). 上面(1)(2)函數(shù)是用于生成render buffer的存儲(chǔ)空間,生成空間之后堵腹,則需要將renderbuffer跟framebuffer進(jìn)行綁定炸站,調(diào)用glFramebufferRenderbuffer函數(shù)進(jìn)行綁定,后面的繪制才能起作用

5). 接下來可以調(diào)用OpenGL的函數(shù)進(jìn)行繪制處理疚顷,最后則需要調(diào)用EGALContext的OC方法進(jìn)行最終的渲染繪制旱易,這里渲染的是color buffer禁偎,這個(gè)方法會(huì)講buffer渲染到CALayer上面
- (BOOL)presentRenderbuffer:(NSUInteger)target;

6). 還有一個(gè)需要注意的地方是在退出的時(shí)候,需要調(diào)用glDelegateFramebuffers或者glDeleteRenderbuffers函數(shù)刪除frame
 buffer或者render buffer

9.開始渲染阀坏,添加如下函數(shù):

-(void)render
{
    //設(shè)置清屏顏色,默認(rèn)是黑色如暖,如果你的運(yùn)行結(jié)果是黑色,問題就可能在這兒
    glClearColor(0.3, 0.5, 0.8, 1.0);
    /*
    glClear指定清除的buffer
    共可設(shè)置三個(gè)選項(xiàng)GL_COLOR_BUFFER_BIT全释,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT
    也可組合如:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    這里我們只用了color buffer装处,所以只需清除GL_COLOR_BUFFER_BIT
     */
    glClear(GL_COLOR_BUFFER_BIT);
    
    [_context presentRenderbuffer:_renderBuffer];
}

10.重寫 initWithFrame 方法,并調(diào)用上述函數(shù):

-(instancetype)initWithFrame:(CGRect)frame{
    if (self==[super initWithFrame:frame]) {
        [self setupLayer];
        [self setupContext];
        [self setupRenderBuffer];
        [self setupFrameBuffer];
        [self render];
    }
    
    return self;
}

11.使用與運(yùn)行結(jié)果:
在你的ViewController中導(dǎo)入MyGLView頭文件并在viewDidLoad方法中添加如下代碼:

MyGLView *openGLView = [[MyGLView alloc]initWithFrame:self.view.bounds];
    self.view = openGLView;
//    [self.view addSubview:openGLView];

運(yùn)行結(jié)果如下:


運(yùn)行結(jié)果.png

接下來的文章會(huì)使用到OpenGLES的坐標(biāo)點(diǎn)浸船,這里先介紹下在OpenGL里,它的坐標(biāo)表現(xiàn):

坐標(biāo)系.png

它的x寝蹈、y李命、z的范圍都在-1到1之間,坐標(biāo)原點(diǎn)在圖中正方體的中心箫老。如圖畫的一個(gè)白色三角形封字,它的三個(gè)坐標(biāo)分別是:(-0.5,0.5,0.0)、(-0.5,-0.5,0.0)和(0.5,-0.5,0.0)耍鬓,請(qǐng)對(duì)著圖好好理解理解.

所有教程代碼在此 : https://github.com/qingmomo/iOS-OpenGLES-

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阔籽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牲蜀,更是在濱河造成了極大的恐慌笆制,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣达,死亡現(xiàn)場(chǎng)離奇詭異在辆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)度苔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門匆篓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寇窑,你說我怎么就攤上這事鸦概。” “怎么了甩骏?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵窗市,是天一觀的道長。 經(jīng)常有香客問我横漏,道長谨设,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任缎浇,我火速辦了婚禮扎拣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己二蓝,他們只是感情好誉券,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刊愚,像睡著了一般踊跟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸥诽,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天商玫,我揣著相機(jī)與錄音,去河邊找鬼牡借。 笑死拳昌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钠龙。 我是一名探鬼主播炬藤,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碴里!你這毒婦竟也來了沈矿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤咬腋,失蹤者是張志新(化名)和其女友劉穎羹膳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帝火,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溜徙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了犀填。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡九巡,死狀恐怖图贸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冕广,我是刑警寧澤疏日,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站撒汉,受9級(jí)特大地震影響沟优,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睬辐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一挠阁、第九天 我趴在偏房一處隱蔽的房頂上張望宾肺。 院中可真熱鬧,春花似錦侵俗、人聲如沸锨用。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽增拥。三九已至,卻和暖如春寻歧,著一層夾襖步出監(jiān)牢的瞬間掌栅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工熄求, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渣玲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓弟晚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逾苫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卿城,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348