OpenGL ES之GLKit框架學(xué)習(xí)

一:GLKit框架概述

1:GLKit 框架的設(shè)計(jì)?標(biāo)是為了簡(jiǎn)化基于OpenGL / OpenGL ES 的應(yīng)用開(kāi)發(fā)。它的出現(xiàn)加快OpenGL ES或OpenGL應(yīng)用程序開(kāi)發(fā)芜飘。 使用數(shù)學(xué)庫(kù)堪簿,背景紋理加載,預(yù)先創(chuàng)建的著?器效果喘批,以及標(biāo)準(zhǔn)視圖和視圖控制器來(lái)實(shí)現(xiàn)渲染循環(huán)撩荣。
2:GLKit框架提供了功能和類(lèi),可以減少創(chuàng)建新的基于著?器的應(yīng)用程序所需的?作量饶深,或者?持依賴早期版本的OpenGL ES或OpenGL提供的固定函數(shù)頂點(diǎn)或片段處理的現(xiàn)有應(yīng)?程序餐曹。

GLKit框架常用類(lèi)

一:GLKView

提供繪制場(chǎng)所(View) GLKView繼承UIView

** GLKView常用屬性**
1:幀緩存區(qū)屬性

//繪制視圖內(nèi)容時(shí)使用的OpenGL ES 上下文
@property (nonatomic, retain) EAGLContext *context;
//底層緩存區(qū)對(duì)象的?高度(以像素為單位)
@property (nonatomic, readonly) NSInteger drawableWidth;
//底層緩存區(qū)對(duì)象的寬度(以像素為單位)
@property (nonatomic, readonly) NSInteger drawableHeight;

2:配置幀緩存區(qū)對(duì)象

//顏?色渲染緩存區(qū)格式
@property (nonatomic) GLKViewDrawableColorFormat drawableColorFormat;
//深度渲染緩存區(qū)格式
@property (nonatomic) GLKViewDrawableDepthFormat drawableDepthFormat;
//模板渲染緩存區(qū)的格式
@property (nonatomic) GLKViewDrawableStencilFormat drawableStencilFormat;
//多重采樣緩存區(qū)的格式
@property (nonatomic) GLKViewDrawableMultisample drawableMultisample;

3:使?OpenGL ES 繪制內(nèi)容的視圖默認(rèn)實(shí)現(xiàn)

//將底層FrameBuffer 對(duì)象綁定到OpenGL ES
- (void)bindDrawable;
//刪除與視圖關(guān)聯(lián)的可繪制對(duì)象(刪除視圖FrameBuffer對(duì)象)
- (void)deleteDrawable;
//布爾值,指定視圖是否響應(yīng)使得視圖內(nèi)容無(wú)效的消息
@property (nonatomic) BOOL enableSetNeedsDisplay;
//繪制視圖內(nèi)容并將其作為新圖像對(duì)象返回
@property (readonly, strong) UIImage *snapshot;
//立即重繪視圖內(nèi)容
- (void)display;

4:GLKViewDelegate 用于GLKView 對(duì)象回調(diào)?法?于GLKView 對(duì)象回調(diào)方法

@required
//繪制視圖內(nèi)容
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;
二:GLKViewController 管理OpenGL ES 渲染循環(huán)的視圖控制器

1:(擴(kuò)展于標(biāo)準(zhǔn)的UIKit 設(shè)計(jì)模式. ?于繪制視圖內(nèi)容的管理與呈現(xiàn).)
2:繼承UIViewController,并且遵守了GLKViewDelegate,實(shí)現(xiàn)GLKView的代理方法

1:更新方式:

- (void) update 更新視圖內(nèi)容
- (void)glkViewControllerUpdate:(GLKViewController *)controller;

2:配置幀速率屬性

//視圖控制器調(diào)用視圖以及更新視圖內(nèi)容的速率
@property (nonatomic) NSInteger preferredFramesPerSecond
// 視圖控制器調(diào)?視圖以及更新其內(nèi)容的實(shí)際速率
@property (nonatomic, readonly) NSInteger framesPerSecond;

3:控制幀更新屬性

//渲染循環(huán)是否已暫停
@property (nonatomic, getter=isPaused) BOOL paused;
//當(dāng)前程序重新激活活動(dòng)狀態(tài)時(shí)視圖控制器是都自動(dòng)暫停渲染循環(huán)
@property (nonatomic) BOOL pauseOnWillResignActive;
//當(dāng)前程序變?yōu)榛顒?dòng)狀態(tài)時(shí)視圖控制器是否自動(dòng)恢復(fù)呈現(xiàn)循環(huán)
@property (nonatomic) BOOL resumeOnDidBecomeActive;

4:獲取有關(guān)View的更新信息

//視圖控制器自創(chuàng)建以來(lái)發(fā)送的幀更新數(shù)
@property (nonatomic, readonly) NSInteger framesDisplayed;
//?視圖控制器第一次恢復(fù)發(fā)送更新事件以來(lái)經(jīng)過(guò)的時(shí)間量
@property (nonatomic, readonly) NSTimeInterval timeSinceFirstResume;
//?上次視圖控制器恢復(fù)發(fā)送更新事件以來(lái)更新的時(shí)間量
@property (nonatomic, readonly) NSTimeInterval timeSinceLastResume;
//?上次視圖控制器調(diào)用委托方法以及經(jīng)過(guò)的時(shí)間量
@property (nonatomic, readonly) NSTimeInterval timeSinceLastUpdate;
//?上次視圖控制器調(diào)?委托?法以及經(jīng)過(guò)的時(shí)間量
@property (nonatomic, readonly) NSTimeInterval timeSinceLastDraw;

5:GLKViewControllerDelegate 渲染循環(huán)回調(diào)方法

@required
//顯示每個(gè)幀之前調(diào)用
- (void)glkViewControllerUpdate:(GLKViewController *)controller;
@optional
//在渲染循環(huán)暫停或者恢復(fù)之前調(diào)用
- (void)glkViewController:(GLKViewController *)controller willPause:(BOOL)pause;
三:GLKBaseEffect?種簡(jiǎn)單光照/著色系統(tǒng),用于基于著?器OpenGL 渲染

1:配置模型視圖轉(zhuǎn)換

//綁定效果時(shí)用于頂點(diǎn)數(shù)據(jù)模型視圖,投影和紋理變換
@property (nonatomic, readonly)       GLKEffectPropertyTransform         *transform;

2:配置光照效果

//?于計(jì)算每個(gè)片段的光照策略
@property (nonatomic, assign)         GLKLightingType                    lightingType; 
typedef NS_ENUM(GLint, GLKLightingType)
{
    //表示在三?形中每個(gè)頂點(diǎn)執(zhí)?光照計(jì)算,然后在三角形進(jìn)?插值
    GLKLightingTypePerVertex,
    //表示光照計(jì)算的輸入在三角形內(nèi)插入,并且在每個(gè)?段執(zhí)?光照計(jì)算
    GLKLightingTypePerPixel
} NS_ENUM_AVAILABLE(10_8, 5_0);

3:配置光照

//表示為基元的兩側(cè)計(jì)算光照
@property (nonatomic, assign)         GLboolean                          lightModelTwoSided;     
//計(jì)算渲染圖元光照使用的材質(zhì)屬性 
@property (nonatomic, readonly)       GLKEffectPropertyMaterial          *material;
//環(huán)境顏色,應(yīng)用效果渲染的所有圖元
@property (nonatomic, assign)         GLKVector4                         lightModelAmbientColor;
//場(chǎng)景中第一,第二,第三光照屬性
@property (nonatomic, readonly)    
   GLKEffectPropertyLight             *light0, *light1, *light2;   // Disabled

4:配置紋理

//紋理應(yīng)用于渲染圖元的順序
@property (nullable, nonatomic, copy) NSArray<GLKEffectPropertyTexture*> *textureOrder;  
//第一,第二紋理屬性
@property (nonatomic, readonly)       GLKEffectPropertyTexture           *texture2d0, *texture2d1; 

5:配置霧化

//應(yīng)用于場(chǎng)景的霧屬性
@property (nonatomic, readonly)       GLKEffectPropertyFog               *fog; 

6:配置顏色信息

//表示計(jì)算光照與材質(zhì)交互時(shí)是否使用顏?頂點(diǎn)屬性
@property (nonatomic, assign)         GLboolean                          colorMaterialEnabled;        // GL_FALSE
//指是否使用常量顏色
@property (nonatomic, assign)         GLboolean                          useConstantColor;            // GL_TRUE
//不提供每個(gè)頂點(diǎn)顏色數(shù)據(jù)時(shí)使用常量顏色
@property (nonatomic, assign)         GLKVector4                         constantColor;               // { 1.0, 1.0, 1.0, 1.0 }

7:準(zhǔn)備繪制效果

- (void) prepareToDraw;

二: GLKit作用

1:加載紋理
2:提供高性能的數(shù)學(xué)運(yùn)算
3:提供常見(jiàn)的著色器
4:提供視圖以及視圖控制器

三:配置GLKit視圖

- (void)viewDidLoad{ [super viewDidLoad];
//創(chuàng)建OpenGL ES上下文并將其分配給從故事板加載的視圖
GLKView * view =(GLKView *)self.view;
view.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
//配置視圖創(chuàng)建的渲染緩沖區(qū)
view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
view.drawableStencilFormat = GLKViewDrawableStencilFormat8;
//啟?用多重采樣
view.drawableMultisample = GLKViewDrawableMultisample4X;
}
-(void)drawRect:(CGRect)rect
{
//清除幀緩沖區(qū)
glClearColor(0.0f敌厘,0.0f台猴,0.1f,1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//使?用先前配置的紋理理俱两,著?色器器和頂點(diǎn)數(shù)組繪制 glBindTexture(GL_TEXTURE_2D饱狂,_planetTexture);
glUseProgram(_diffuseShading);
glUniformMatrix4fv(_uniformModelViewProjectionMatrix,1,0宪彩,_modelViewProjectionMatrix.m);
glBindVertexArrayOES(_planetMesh);
glDrawElements(GL_TRIANGLE_STRIP休讳,256,GL_UNSIGNED_SHORT);

四: GLKit紋理加載

1:GLKTextureInfo創(chuàng)建OpenGL紋理信息

** GLKTextureInfo常用屬性**

{
@private
    GLuint                      name;//OpenGL 上下?文中紋理理名稱
    GLenum                      target;//綁定紋理的目標(biāo)
    GLuint                      width;//加載紋理的寬度
    GLuint                      height;//加載紋理的高度
    GLuint                      depth;//加載我紋理的深度
    GLKTextureInfoAlphaState    alphaState;//加載紋理中alpha分量狀態(tài)
    GLKTextureInfoOrigin        textureOrigin;加載紋理中的原點(diǎn)位置
    BOOL                        containsMipmaps;加載紋理是否包含mip貼圖
    GLuint                      mimapLevelCount;//紋理的mipmap層級(jí)數(shù)
    GLuint                      arrayLength;
}
1:GLTextureLoader 簡(jiǎn)化從各種資源?件中加載紋理

** GLTextureLoader初始化方法**

#if TARGET_OS_IPHONE
//初始化一個(gè)新的紋理加載到對(duì)象中
- (instancetype)initWithSharegroup:(EAGLSharegroup *)sharegroup;
#else
//初始化一個(gè)新的紋理加載對(duì)象
- (instancetype)initWithShareContext:(NSOpenGLContext *)context;
#endif

** GLTextureLoader加載各種資源方法**
1:從文件中加載

//從文件加載2D紋理圖像并從數(shù)據(jù)中創(chuàng)建新的紋理
+ (nullable GLKTextureInfo *)textureWithContentsOfFile:(NSString *)path                                       /* File path of image. */
                                               options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                                                 error:(NSError * __nullable * __nullable)outError;
//從文件中異步加載2D紋理圖像,并根據(jù)數(shù)據(jù)創(chuàng)建新紋理
- (void)textureWithContentsOfFile:(NSString *)path                                       /* File path of image. */
                          options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                            queue:(nullable dispatch_queue_t)queue                       /* Dispatch queue, or NULL to use the main queue. */
                completionHandler:(GLKTextureLoaderCallback)block;           

2:從URL加載紋理

//從URL加載2D紋理圖像并從數(shù)據(jù)中創(chuàng)建新的紋理
- (void)textureWithContentsOfURL:(NSURL *)url                                           /* File path of image. */
                         options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                           queue:(nullable dispatch_queue_t)queue                       /* Dispatch queue, or NULL to use the main queue. */
               completionHandler:(GLKTextureLoaderCallback)block;                       /* Block to be invoked on the above dispatch queue. */
//從URL異步加載2D紋理圖像,并根據(jù)數(shù)據(jù)創(chuàng)建新紋理;
+ (nullable GLKTextureInfo *)textureWithContentsOfURL:(NSURL *)url                                           /* The URL from which to read. */
                                              options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                                                error:(NSError * __nullable * __nullable)outError;  

3:從內(nèi)存中加載紋理

//從內(nèi)存中加載2D紋理圖像,并根據(jù)數(shù)據(jù)創(chuàng)建新的紋理
- (void)textureWithContentsOfData:(NSData *)data                                         /* NSData containing image contents. */
                          options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                            queue:(nullable dispatch_queue_t)queue                       /* Dispatch queue, or NULL to use the main queue. */
                completionHandler:(GLKTextureLoaderCallback)block;                       
//從內(nèi)存中異步加載2D紋理圖像,并從數(shù)據(jù)中創(chuàng)建新紋理
+ (nullable GLKTextureInfo *)textureWithContentsOfData:(NSData *)data                                         /* NSData containing image contents. */
                                               options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                                                 error:(NSError * __nullable * __nullable)outError;   

4:從CGImages加載紋理

//從Quartz圖像 加載2D紋理理圖像并從數(shù)據(jù)創(chuàng)建新紋理
- (void)textureWithCGImage:(CGImageRef)cgImage                                    /* CGImage reference. */
                   options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                     queue:(nullable dispatch_queue_t)queue                       /* Dispatch queue, or NULL to use the main queue. */
         completionHandler:(GLKTextureLoaderCallback)block;   
//   從Quartz圖像異步加載2D紋理理圖像并從數(shù)據(jù)創(chuàng)建新紋理
+ (nullable GLKTextureInfo *)textureWithCGImage:(CGImageRef)cgImage                                    /* CGImage reference. */
                                        options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                                          error:(NSError * __nullable * __nullable)outError;                 

5:從文件中加載多維數(shù)據(jù)加載紋理

//從單個(gè)文件加載?方體貼圖紋理對(duì)象,并從數(shù)據(jù)中創(chuàng)建新紋理
- (void)cubeMapWithContentsOfFile:(NSString *)path                                       /* File path of image. */
                          options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                            queue:(nullable dispatch_queue_t)queue                       /* Dispatch queue, or NULL to use the main queue. */
                completionHandler:(GLKTextureLoaderCallback)block;                       /* Block to be invoked on the above dispatch queue. */
//從單個(gè)文件異步加載?方體貼圖紋理對(duì)象,并從數(shù)據(jù)中創(chuàng)建新紋理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfFile:(NSString *)path                                       /* File path of image. */
                                              options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                                                error:(NSError * __nullable * __nullable)outError;           /* Error description. */
//從?系列文件異步加載?方體貼圖紋理圖像,并從數(shù)據(jù)中創(chuàng)建新紋理
- (void)cubeMapWithContentsOfFiles:(NSArray<id> *)paths                                   /* An array of paths (NSStrings or NSURLs). */
                           options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Options that control how the image is loaded. */
                             queue:(nullable dispatch_queue_t)queue                       /* Dispatch queue, or NULL to use the main queue. */
                 completionHandler:(GLKTextureLoaderCallback)block;                       /* Block to be invoked on the above dispatch queue. */
//從?系列文件加載?方體貼圖紋理圖像,并從數(shù)據(jù)中創(chuàng)建新紋理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfFiles:(NSArray<id> *)paths                                   /* An array of paths (NSStrings or NSURLs). */
                                               options:(nullable NSDictionary<NSString*, NSNumber*> *)options /* Otions that control how the image is loaded. */
                                                 error:(NSError * __nullable * __nullable)outError;           /* Error description. */

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毯焕,一起剝皮案震驚了整個(gè)濱河市衍腥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纳猫,老刑警劉巖婆咸,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芜辕,居然都是意外死亡尚骄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)侵续,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倔丈,“玉大人,你說(shuō)我怎么就攤上這事状蜗⌒栉澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵轧坎,是天一觀的道長(zhǎng)宏邮。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么蜜氨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任械筛,我火速辦了婚禮,結(jié)果婚禮上飒炎,老公的妹妹穿的比我還像新娘埋哟。我一直安慰自己,他們只是感情好郎汪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赤赊。 她就那樣靜靜地躺著,像睡著了一般怒竿。 火紅的嫁衣襯著肌膚如雪砍鸠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天耕驰,我揣著相機(jī)與錄音爷辱,去河邊找鬼。 笑死朦肘,一個(gè)胖子當(dāng)著我的面吹牛饭弓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播媒抠,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼弟断,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了趴生?” 一聲冷哼從身側(cè)響起阀趴,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苍匆,沒(méi)想到半個(gè)月后刘急,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浸踩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年叔汁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片检碗。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡据块,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出折剃,到底是詐尸還是另有隱情另假,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布怕犁,位于F島的核電站边篮,受9級(jí)特大地震影響开睡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苟耻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扶檐。 院中可真熱鬧凶杖,春花似錦、人聲如沸款筑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奈梳。三九已至杈湾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攘须,已是汗流浹背漆撞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留于宙,地道東北人浮驳。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像捞魁,于是被迫代替她去往敵國(guó)和親至会。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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