Hello--OpenGLES/(GLKit/CoreAnimation正方體的渲染+旋轉(zhuǎn))

一.Hello--OpenGLES?

????????????????OpenGL可用于渲染2D和3D圖像瘸羡,是一個多用途的開源圖形庫。OpenGL設(shè)計用來將函數(shù)命令轉(zhuǎn)換成圖形命令搓茬,發(fā)送到GPU中犹赖。GPU正是被設(shè)計用來處理圖形命令的,所以O(shè)penGL的繪制非常高效卷仑。

????????????????OpenGLES是OpenGL的簡化版本峻村,拋棄了冗余的文件及命令,使之專用于嵌入式設(shè)備锡凝。OpenGLES使得移動APP能充分利用GPU的強(qiáng)大運(yùn)算能力粘昨。iOS設(shè)備上的GPU能執(zhí)行更精確的2D和3D繪制,以及更加復(fù)雜的針對每個像素的圖形腳本(shader)計算窜锯。?持的平臺: iOS, Andriod , BlackBerry ,bada ,Linux ,Windows张肾。

1.1準(zhǔn)備工程

????????????????iOS新建工程淆游,@interface ViewController : UIViewController改成-->@interface ViewController : GLKViewController,.h文件導(dǎo)入#import<GLKit/GLKit.h>炸渡,.m導(dǎo)入#import<OpenGLES/ES3/gl.h>#import<OpenGLES/ES3/glext.h>,最后在Main.storyboard中將view改成GLVIew

GLView

1.2EAGLContext(OpenGL 上下文)

? ??????????????EAGLContext對象管理著OpenGLES的渲染context岗喉,即所有繪制的狀態(tài)驾孔,命令及資源信息芍秆,并控制GPU去執(zhí)行渲染運(yùn)算。 繪制如textures及renderbuffers的過程翠勉,是由一個與context綁定的EAGLSharegroup對象來管理的妖啥。當(dāng)初始化一個EAGLContext對象的時候,可選擇新建一個sharegroup对碌,或者使用已有的荆虱,這一點我們往往采用系統(tǒng)默認(rèn)即可。在繪制到context之前,我們要先綁定一個完整的framebuffer對象到context中怀读。

Hello-OpenGLES

? ? ? ? ? ? ? ? 1)初始化上寫文:context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3];(參數(shù)知識選擇版本)

? ? ? ? ? ? ? ? 2)設(shè)置當(dāng)前上下文:[EAGLContext setCurrentContext:context];

? ? ? ? ? ? ? ? 3)GLView綁定上下文:GLKView *view =(GLKView *) self.view; ?view.context=context;

? ? ? ? ? ? ? ? 注意:在使用GLview中诉位,我們必須實現(xiàn)它的協(xié)議:GLKViewDelegate--->- (void)glkView:(GLKView*)viewdrawInRect:(CGRect)rect,GLKView對象使其OpenGL ES上下文成為當(dāng)前上下文愿吹,并將其framebuffer綁定為OpenGL ES呈現(xiàn)命令的目標(biāo)不从。然后,委托方法應(yīng)該繪制視圖的內(nèi)容犁跪。我們給GLview設(shè)置顏色椿息,看一下效果:glClearColor(1, 0, 0, 1.0);

Hello--OpenGlES

二.顯示圖片


加載圖片

2.1設(shè)置頂點坐標(biāo)/紋理坐標(biāo)

?????????????????在OpenGl中我們顯示一張圖片,首先我們設(shè)置頂點數(shù)組坷衍,綁定紋理寝优,在OpenGLES中,我們一樣這么設(shè)置:

????????????????????????????????GLfloatvertexData[] = {

? ? ? ? ????????????????????????????????????????????????????????????????0.5, -0.5,0.0f,? ? 1.0f,0.0f,//右下

? ? ? ????????????????????????????????????????????????????????????????? 0.5,0.5,? 0.0f,? ? 1.0f,1.0f,//右上

? ? ? ? ????????????????????????????????????????????????????????????????-0.5,0.5,0.0f,? ? 0.0f,1.0f,//左上


? ? ? ????????????????????????????????????????????????????????????????? 0.5, -0.5,0.0f,? ? 1.0f,0.0f,//右下

? ? ? ????????????????????????????????????????????????????????????????? -0.5,0.5,0.0f,? ? 0.0f,1.0f,//左上

? ? ? ????????????????????????????????????????????????????????????????? -0.5, -0.5,0.0f,? 0.0f,0.0f,//左下

? ????????????????????????????????????????????????????????????????? };

? ????????????????在OpenGL中我們提到了圖形繪制是點枫耳,線乏矾,三角形,正方形由兩個三角形組成迁杨,就是六個頂點钻心,而我們知道,紋理的坐標(biāo)范圍是(0铅协,1)捷沸,其原點是在左下角,所以坐標(biāo)(0狐史,0)是原點痒给,右上角(1,1)骏全;

2.2開辟頂點緩存區(qū)并把數(shù)據(jù)存到緩中區(qū)

????????????????(1).創(chuàng)建頂點緩存區(qū)標(biāo)識符ID

? ? ????????????????????GLuint ?bufferID;

? ????????????????????? glGenBuffers(1, &bufferID);(分配紋理)

????????????????(2).綁定頂點緩存區(qū).(明確作用)

? ??????????????????????glBindBuffer(GL_ARRAY_BUFFER, bufferID);

? ??????????????(3).將頂點數(shù)組的數(shù)據(jù)copy到頂點緩存區(qū)中(GPU顯存中)

? ??????????????????????glBufferData(GL_ARRAY_BUFFER,sizeof(vertexData), vertexData,GL_STATIC_DRAW);

? ? ? ? ? ? ? ? (4).打開讀取通道.

? ? ? ? ? ? ? ? ? ? ? ? 1)頂點坐標(biāo)數(shù)據(jù)

? ????????????????????????? glEnableVertexAttribArray(GLKVertexAttribPosition);

? ? ????????????????????????glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 0);

? ? ? ? ? ? ? ? ? ? ? ? 2)紋理坐標(biāo)數(shù)據(jù)

????????????????????????????glEnableVertexAttribArray(GLKVertexAttribTexCoord0);

? ? ????????????????????????glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 3);

特別說明:

? ??????????????????(1)在iOS中, 默認(rèn)情況下苍柏,出于性能考慮,所有頂點著色器的屬性(Attribute)變量都是關(guān)閉的.意味著,頂點數(shù)據(jù)在著色器端(服務(wù)端)是不可用的. 即使你已經(jīng)使用glBufferData方法,將頂點數(shù)據(jù)從內(nèi)存拷貝到頂點緩存區(qū)中(GPU顯存中).所以, 必須由glEnableVertexAttribArray 方法打開通道.指定訪問屬性.才能讓頂點著色器能夠訪問到從CPU復(fù)制到GPU的數(shù)據(jù).

?? ? ????????????????注意: 數(shù)據(jù)在GPU端是否可見姜贡,即试吁,著色器能否讀取到數(shù)據(jù),由是否啟用了對應(yīng)的屬性決定鲁豪,這就是glEnableVertexAttribArray的功能潘悼,允許頂點著色器讀取GPU(服務(wù)器端)數(shù)據(jù)。

? ????????????????? (2)方法簡介

? ? ????????????????????glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) ? ?功能: 上傳頂點數(shù)據(jù)到顯

存的方法(設(shè)置合適的方式從buffer里面讀取數(shù)據(jù))

? ? ? ? ?參數(shù)列表:

? ? ? ? ????????????????index,指定要修改的頂點屬性的索引值,例如 size, 每次讀取數(shù)量爬橡。(如position是由3個(x,y,z)組成,而顏色是4個(r,g,b,a),紋理則是2個,type,指定數(shù)組中每個組件的數(shù)據(jù)類型棒动〔谏辏可用的符號常量有GL_BYTE, GL_UNSIGNED_BYTE,GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值為GL_FLOAT船惨。 normalized,指定當(dāng)被訪問時柜裸,固定點數(shù)據(jù)值是否應(yīng)該被歸一化(GL_TRUE)或者直接轉(zhuǎn)換為固定點值(GL_FALSE)stride,指定連續(xù)頂點屬性之間的偏移量缕陕。如果為0,那么頂點屬性會被理解為:它們是緊密排列在一起的疙挺。初始值為0 ,ptr指定一個指針扛邑,指向數(shù)組中第一個頂點屬性的第一個組件。初始值為0


參數(shù)流程說明

2.2獲取紋理


紋理

? ? ? ? ? ? ? ? 1)路徑:NSString *filePath = [[NSBundle mainBundle]pathForResource:@"kunkun" ofType:@"jpg"];

? ? ? ? ? ? ? ? 2)參數(shù):NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@(1),GLKTextureLoaderOriginBottomLeft, nil];

?? ?????????????????????????????GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];

? ? ? ? ? ? ? ? 說明:紋理坐標(biāo)原點是左下角,但是圖片顯示原點應(yīng)該是左上角.我們要設(shè)置圖片繪制從左上角開始繪制GLKTextureLoaderOriginBottomLeft铐然;

? ? ? ? ? ? ? ? 3)cEffect:你可以把它理解成UIimageVIew蔬崩,用于顯示圖片的控件,iOS提供GLKBaseEffect 完成著色器工作(頂點/片元)

????????????????????????????cEffect = [[GLKBaseEffect alloc]init];

? ? ????????????????????????cEffect.texture2d0.enabled = GL_TRUE;

? ? ????????????????????????cEffect.texture2d0.name= textureInfo.name;

????????????????最后在GLVIew的delegate中:

????????????????????????????????????????????????1.清除顏色緩沖區(qū)

? ? ????????????????????????????????????????????glClear(GL_COLOR_BUFFER_BIT);

?? ?????????????????????????????????????????????2.準(zhǔn)備繪制

? ? ????????????????????????????????????????????[cEffect prepareToDraw];

?? ?????????????????????????????????????????????3.開始繪制

? ? ????????????????????????????????????????????glDrawArrays(GL_TRIANGLES, 0, 6);


效果

三.OpenGLES繪制立方體

? ? ? ? 在OpenGLES繪制立方體搀暑,相當(dāng)于繪制六個面沥阳,十二個三角形,60個數(shù)據(jù)(當(dāng)然你在圖元連接方式那里可以選擇平面自点,GL_TRIANGLE_FAN桐罕,這樣就會少設(shè)置一點數(shù)據(jù),這里我選擇GL_TRIANGLES)

GLfloatvertexData[] = {

? ? ? ? //第一個面

? ? ? ? 0.5, -0.5, -0.5f,? ? 1.0f,0.0f,//右下

? ? ? ? 0.5,0.5,? -0.5f,? ? 1.0f,1.0f,//右上

? ? ? ? -0.5,0.5, -0.5f,? ? 0.0f,1.0f,//左上

? ? ? ? -0.5, -0.5, -0.5f,? 0.0f,0.0f,//左下

? ? ? ? 0.5, -0.5,0.5f,? ? 1.0f,0.0f,//右下

? ? ? ? 0.5,0.5,? 0.5f,? ? 1.0f,1.0f,//右上

? ? ? ? -0.5,0.5,0.5f,? ? 0.0f,1.0f,//左上

? ? ? ? -0.5, -0.5,0.5f,? 0.0f,0.0f,//左下

//

? ? ? ? //2

? ? ? ? 0.5, -0.5, -0.5f,? ? 1.0f,0.0f,//右下

? ? ? ? 0.5, -0.5,0.5f,? ? 1.0f,1.0f,//右下

? ? ? ? -0.5, -0.5,0.5f,? ? 0.0f,1.0f,//右下

? ? ? ? -0.5, -0.5, -0.5f,? ? 0.0f,0.0f,//右下

? ? ? ? 0.5,0.5, -0.5f,? ? 1.0f,0.0f,//右下

? ? ? ? 0.5,0.5,0.5f,? ? 1.0f,1.0f,//右下

? ? ? ? -0.5,0.5,0.5f,? ? 0.0f,1.0f,//右下

? ? ? ? -0.5,0.5, -0.5f,? ? 0.0f,0.0f,//右下

? ? ? ? //3

? ? ? ? 0.5, -0.5, -0.5f,? ? 1.0f,0.0f,//右下

? ? ? ? 0.5, -0.5,0.5f,? ? 1.0f,1.0f,//右下

? ? ? ? 0.5,0.5,0.5f,? ? 0.0f,1.0f,//右下

? ? ? ? 0.5,0.5, -0.5f,? ? 0.0f,0.0f,//右下

? ? ? ? -0.5, -0.5, -0.5f,? ? 1.0f,0.0f,//右下

? ? ? ? -0.5, -0.5,0.5f,? ? 1.0f,1.0f,//右下

? ? ? ? -0.5,0.5,0.5f,? ? 0.0f,1.0f,//右下

? ? ? ? -0.5,0.5, -0.5f,? ? 0.0f,0.0f,//右下

? ? };


效果


四桂敛。CoreAnimation正方體的大體原理就是一個VIew上放六個imageVIew功炮,并設(shè)置imageVIew旋轉(zhuǎn)組成一個立方體,一共6個术唬,最后添加定時器控制view的layer轉(zhuǎn)動薪伏,達(dá)到效果,因為比較簡單碴开,這里不做展示

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毅该,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子潦牛,更是在濱河造成了極大的恐慌眶掌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巴碗,死亡現(xiàn)場離奇詭異朴爬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)橡淆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門召噩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逸爵,你說我怎么就攤上這事具滴。” “怎么了师倔?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵构韵,是天一觀的道長。 經(jīng)常有香客問我,道長疲恢,這世上最難降的妖魔是什么凶朗? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮显拳,結(jié)果婚禮上棚愤,老公的妹妹穿的比我還像新娘。我一直安慰自己杂数,他們只是感情好宛畦,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耍休,像睡著了一般刃永。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羊精,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天斯够,我揣著相機(jī)與錄音,去河邊找鬼喧锦。 笑死读规,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燃少。 我是一名探鬼主播束亏,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阵具!你這毒婦竟也來了碍遍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阳液,失蹤者是張志新(化名)和其女友劉穎怕敬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帘皿,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡东跪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹰溜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虽填。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖曹动,靈堂內(nèi)的尸體忽然破棺而出斋日,到底是詐尸還是另有隱情,我是刑警寧澤墓陈,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布桑驱,位于F島的核電站竭恬,受9級特大地震影響跛蛋,放射性物質(zhì)發(fā)生泄漏熬的。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一赊级、第九天 我趴在偏房一處隱蔽的房頂上張望押框。 院中可真熱鬧,春花似錦理逊、人聲如沸橡伞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兑徘。三九已至,卻和暖如春羡洛,著一層夾襖步出監(jiān)牢的瞬間挂脑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工欲侮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留崭闲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓威蕉,卻偏偏與公主長得像刁俭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子韧涨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354