OpenGLView

//
//  OpenGLView.h
//  HelloOpenGL
//
//  Created by yanwu wei on 2017/5/2.
//  Copyright ? 2017年 Ivan. All rights reserved.
//

//引入OpenGL的Header殉挽,創(chuàng)建一些后面會用到的實例變量胁住。


#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>

@interface OpenGLView : UIView
{
    CAEAGLLayer* _eaglLayer;
    EAGLContext* _context;
    GLuint _colorRenderBuffer;
}

@end
//
//  OpenGLView.m
//  HelloOpenGL
//
//  Created by yanwu wei on 2017/5/2.
//  Copyright ? 2017年 Ivan. All rights reserved.
//

#import "OpenGLView.h"

@implementation OpenGLView

//設(shè)置layer class 為 CAEAGLLayer
//想要顯示OpenGL的內(nèi)容蚌卤,你需要把它缺省的layer設(shè)置為一個特殊的layer瘾杭。
//(CAEAGLLayer)得糜。這里通過直接復(fù)寫layerClass的方法肛跌。
+ (Class)layerClass
{
    return [CAEAGLLayer class];
}



//4) 設(shè)置layer為不透明(Opaque)
//因為缺省的話教寂,CALayer是透明的籍滴。而透明的層對性能負(fù)荷很大,特別是OpenGL的層贰镣。
//(如果可能呜象,盡量都把層設(shè)置為不透明膳凝。
//另一個比較明顯的例子是自定義tableview cell)
- (void)setupLayer
{
    _eaglLayer = (CAEAGLLayer*) self.layer;
    _eaglLayer.opaque = YES;
}

//5)創(chuàng)建OpenGL context

//無論你要OpenGL幫你實現(xiàn)什么,總需要這個 EAGLContext恭陡。
//EAGLContext管理所有通過OpenGL進(jìn)行draw的信息蹬音。
//這個與Core Graphics context類似。
//當(dāng)你創(chuàng)建一個context休玩,你要聲明你要用哪個version的API著淆。
//這里,我們選擇OpenGL ES 2.0.
//(容錯處理拴疤,如果創(chuàng)建失敗了永部,我們的程序會退出)

- (void)setupContext
{
    EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2;
    _context = [[EAGLContext alloc] initWithAPI:api];
    if (!_context)
    {
        NSLog(@"Failed to initialize OpenGLES 2.0 context");
        exit(1);
    }
    
    if (![EAGLContext setCurrentContext:_context])
    {
        NSLog(@"Failed to set current OpenGL context");
        exit(1);
    }
}

//6)創(chuàng)建render buffer (渲染緩沖區(qū))

//Render buffer 是OpenGL的一個對象,用于存放渲染過的圖像呐矾。
//有時候你會發(fā)現(xiàn)render buffer會作為一個color buffer被引用苔埋,
//因為本質(zhì)上它就是存放用于顯示的顏色。
//創(chuàng)建render buffer的三步:
//1.     調(diào)用glGenRenderbuffers來創(chuàng)建一個新的render buffer object蜒犯。
//這里返回一個唯一的integer來標(biāo)記render buffer
//(這里把這個唯一值賦值到_colorRenderBuffer)组橄。
//有時候你會發(fā)現(xiàn)這個唯一值被用來作為程序內(nèi)的一個OpenGL 的名稱。
//(反正它唯一嘛)
//2.     調(diào)用glBindRenderbuffer 罚随,告訴這個OpenGL:
//我在后面引用GL_RENDERBUFFER的地方玉工,
//其實是想用_colorRenderBuffer。其實就是告訴OpenGL淘菩,
//我們定義的buffer對象是屬于哪一種OpenGL對象
//3.     最后遵班,為render buffer分配空間。renderbufferStorage

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


//7)創(chuàng)建一個 frame buffer (幀緩沖區(qū))

//Frame buffer也是OpenGL的對象瞄勾,它包含了前面提到的render buffer费奸,
//以及其它后面會講到的諸如:
//depth buffer、stencil buffer 和 accumulation buffer进陡。
//前兩步創(chuàng)建frame buffer的動作跟創(chuàng)建render buffer的動作很類似愿阐。
//(反正也是用一個glBind什么的)
//而最后一步  glFramebufferRenderbuffer 這個才有點新意。
//它讓你把前面創(chuàng)建的buffer render依附在frame buffer的GL_COLOR_ATTACHMENT0位置上趾疚。

- (void)setupFrameBuffer
{
    GLuint framebuffer;
    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                              GL_RENDERBUFFER, _colorRenderBuffer);
}

//8)清理屏幕

//為了盡快在屏幕上顯示一些什么缨历,在我們和那些 vertexes、shaders打交道之前糙麦,
//把屏幕清理一下辛孵,顯示另一個顏色吧。(RGB 0, 104, 55赡磅,綠色吧)
//這里每個RGB色的范圍是0~1魄缚,所以每個要除一下255.
//下面解析一下每一步動作:
//1.      調(diào)用glClearColor ,設(shè)置一個RGB顏色和透明度,
//接下來會用這個顏色涂滿全屏冶匹。
//2.      調(diào)用glClear來進(jìn)行這個“填色”的動作(大概就是photoshop那個油桶嘛)习劫。
//還記得前面說過有很多buffer的話,這里我們要用到GL_COLOR_BUFFER_BIT來聲明要清理哪一個緩沖區(qū)嚼隘。
//3.      調(diào)用OpenGL context的presentRenderbuffer方法诽里,
//把緩沖區(qū)(render buffer和color buffer)的顏色呈現(xiàn)到UIView上。

- (void)render
{
    glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    [_context presentRenderbuffer:GL_RENDERBUFFER];
}


//9)把前面的動作串起來修改一下OpenGLView.m
// Replace initWithFrame with this
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        [self setupLayer];
        [self setupContext];
        [self setupRenderBuffer];
        [self setupFrameBuffer];
        [self render];
    }
    return self;
}

@end


//
//  ViewController.m
//  HelloOpenGL
//
//  Created by yanwu wei on 2017/5/2.
//  Copyright ? 2017年 Ivan. All rights reserved.
//

#import "ViewController.h"
#import "OpenGLView.h" 

@interface ViewController ()
{
    OpenGLView* _glView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    _glView = [[OpenGLView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:_glView];
    
    
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飞蛹,一起剝皮案震驚了整個濱河市谤狡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卧檐,老刑警劉巖墓懂,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霉囚,居然都是意外死亡拒贱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門佛嬉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闸天,你說我怎么就攤上這事暖呕。” “怎么了苞氮?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵湾揽,是天一觀的道長。 經(jīng)常有香客問我笼吟,道長库物,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任贷帮,我火速辦了婚禮戚揭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撵枢。我一直安慰自己民晒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布锄禽。 她就那樣靜靜地躺著潜必,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沃但。 梳的紋絲不亂的頭發(fā)上磁滚,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機(jī)與錄音宵晚,去河邊找鬼垂攘。 笑死维雇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搜贤。 我是一名探鬼主播谆沃,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仪芒!你這毒婦竟也來了唁影?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤掂名,失蹤者是張志新(化名)和其女友劉穎据沈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饺蔑,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡锌介,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猾警。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孔祸。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖发皿,靈堂內(nèi)的尸體忽然破棺而出崔慧,到底是詐尸還是另有隱情,我是刑警寧澤穴墅,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布惶室,位于F島的核電站,受9級特大地震影響玄货,放射性物質(zhì)發(fā)生泄漏皇钞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一松捉、第九天 我趴在偏房一處隱蔽的房頂上張望夹界。 院中可真熱鬧,春花似錦隘世、人聲如沸掉盅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趾痘。三九已至,卻和暖如春蔓钟,著一層夾襖步出監(jiān)牢的瞬間永票,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留侣集,地道東北人键俱。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像世分,于是被迫代替她去往敵國和親板惑。 傳聞我的和親對象是個殘疾皇子陨收,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 首先現(xiàn)在的行為習(xí)慣有所改變,不管是線上還是線下客戶選擇一樣?xùn)|西和品牌就會去搜索查證那樣產(chǎn)品和品牌瓢阴。越是大的交易越謹(jǐn)...
    預(yù)言谷殼閱讀 509評論 0 0
  • A畅蹂、昨天,刷朋友圈看到小學(xué)同學(xué)的消息荣恐。帶著她家3歲的娃液斜,穿著精致,在咖啡廳自拍叠穆。配文是“陽光真好”少漆。而此時我正在辦...
    小十八閱讀 420評論 4 7
  • 我早晨起床后,趔趔趄趄的走到洗手間硼被,就在這時媽媽來了检疫,說今天中午要去餐廳包餃子,聽到這句話祷嘶,我一下子變得精...
    薛義之Harry閱讀 322評論 1 4
  • 想你 在入睡前 在醒來后 在每一個恍惚的剎那間
    蘇菲1990閱讀 289評論 0 1