第一節(jié):我們不畫三角形!

東西很多,很多東西我就不費(fèi)話了,時(shí)間比金錢重要!

作為一個(gè)IOS程序員,如何學(xué)習(xí)OpenGL?

這一系列的東西,都是經(jīng)過前人總結(jié),然后自己學(xué)習(xí)研究,用于對(duì)IOS程序員理解和學(xué)習(xí)OpenGL的一點(diǎn)點(diǎn)學(xué)習(xí)資料,既是為自己學(xué)習(xí)總結(jié),也是為了同大家共享。

第一步:打開XCode

第二步:新建項(xiàng)目,加入下面兩個(gè)框架:

兩個(gè)框架很重要

第三步:新建一個(gè)繼承UIView的view,取名OpenGlView,按下回車

第四步:

引入三個(gè)頭文件

第五步:重寫這個(gè)view

????????????????+(Class)layerClass 方法

想要顯示OpenGL的內(nèi)容,你需要把它缺省的layer設(shè)置為一個(gè)特殊的layer。(CAEAGLLayer)。這里通過直接復(fù)寫layerClass的方法。相當(dāng)于構(gòu)建了一個(gè)平臺(tái)來畫圖

第六步:創(chuàng)建一個(gè)變量

CAEAGLLayer *_eaglLayer; //我們畫圖就是在這上面

創(chuàng)建一個(gè)方法:


將這個(gè)view的layer賦值給這個(gè)變量;并讓他的opaqua為yes,這樣做的目的是節(jié)省內(nèi)存,使用過tableview cell 應(yīng)該有所了解

第七步:再來一個(gè)變量

EAGLContext *_context;

無(wú)論你想讓OpenGl干什么,這個(gè)EAGLContext是缺一不可的,它管理所有OpenGl進(jìn)行Draw的信息

第三行:分配一個(gè)實(shí)例,表示當(dāng)前使用的是哪個(gè)版本的OpenGL ES,我們使用APIOpenGLES2(為什么要用二,因?yàn)槲乙矂倢W(xué),還不是很清楚1,2,3之間的區(qū)別到底有哪些)第九行:獲取當(dāng)前使用的上下文

第八步,創(chuàng)建幀緩存:

? ? ?因?yàn)檫@里不是說計(jì)算機(jī)圖形學(xué)的,所以我們這里簡(jiǎn)單介紹下:GPU需要知道應(yīng)該在內(nèi)存的什么位置存儲(chǔ)渲染的2d/3d圖像像素?cái)?shù)據(jù)。就像為GPu提供數(shù)據(jù)的緩存一樣,接受渲染結(jié)果的緩存區(qū)叫做幀緩存。程序會(huì)想其他種類的緩存一樣生存,綁定,刪除幀緩存。但是幀緩存不需要初始化,因?yàn)殇秩局噶顣?huì)在適當(dāng)?shù)臅r(shí)候替換緩存的內(nèi)容。幀緩存會(huì)在被綁定的時(shí)候隱式開啟。

1 先創(chuàng)建一個(gè)變量叫做GLuint _colorRenderBuffer;?

用于創(chuàng)建渲染緩存區(qū) *GLuint: 無(wú)符號(hào)四字節(jié)整型,包含數(shù)值從0 到 4,294,967,295

第一行:讓OpenGL給我們一個(gè)唯一表示符,來綁定到我們創(chuàng)建的這個(gè)_colorRenderBuffer的地址(OpenGL中有太多的東西,我們需要一個(gè)唯一的ID,就像身份證一樣來標(biāo)識(shí)出哪個(gè)是哪個(gè)。這個(gè)ID不能我們自己來定,只能告訴OpenGL說,我需要一個(gè)唯一ID,你給我一個(gè)吧。然后,OpenGL就會(huì)給你一個(gè)沒用過的唯一ID,這個(gè)過程是由glGenBuffers來實(shí)現(xiàn)的)

第二行:指明緩存對(duì)象類型:OpenGL中有很多緩存對(duì)象,雖然它給了我們一個(gè)ID,但不知道這個(gè)ID是用來表示什么緩存對(duì)象的。我們要明確告訴它,這里我們告訴它這是一個(gè)渲染幀。

第三行:將EAGLDrawable(我們創(chuàng)建的那個(gè)畫圖的平臺(tái))作為存儲(chǔ)OpenGL ES renderbuffer對(duì)象綁定到這個(gè)渲染緩存區(qū)上。簡(jiǎn)單就是為了為render buffer分配空間。

2 創(chuàng)建幀緩存區(qū)


前面兩部已經(jīng)在上面創(chuàng)建幀緩存區(qū)的時(shí)候解釋作用了。

最后一行:把前面創(chuàng)建的渲染緩存區(qū)依附在幀緩存區(qū)的GL_COLOR_ATTACHMENT0位置上。



好了,我們前面已經(jīng)做了這么多工作,我們先來看點(diǎn)效果吧

創(chuàng)建一個(gè)方法,來看到點(diǎn)什么。

-(void)render{

第一行:設(shè)置一個(gè)顏色,讓這個(gè)顏色充滿這個(gè)viewRGBA你懂的 第二行:使用glClear來用上面的顏色填充GL_COLOR_BUFFER_BIT緩存區(qū) 第三行:OpenGL上下文context將這個(gè)顏色緩存區(qū)中的東西呈現(xiàn)出來

重寫我們這個(gè)view的initFrame方法


之后如果程序正確,呈現(xiàn)的效果如下:


接下來,我們渲染一個(gè)幾何體,因?yàn)橥砩系慕坛潭际窃捯粋€(gè)三角形,畫太多了,所以我們這里畫一個(gè)菱形。

在OpenGL ES2.0 的世界,在場(chǎng)景中渲染任何一種幾何圖形,你都需要?jiǎng)?chuàng)建兩個(gè)稱之為“著色器”的小程序。著色器什么的我們后面說,這里你先打出來

打開你的xcode,F(xiàn)ile\New\New File… 選擇iOS\Other\Empty, 點(diǎn)擊下一步。命名為:

SimpleVertex.glsl 然后保存,將下面的代碼敲進(jìn)去。

這是一個(gè)頂點(diǎn)著色器:

可以看出來,其實(shí)就是一個(gè)C程序

下面再用同樣的方法創(chuàng)建一個(gè)片段著色器。命名為:SimpleFragment.glsl

下面,我們將這兩個(gè)著色器進(jìn)行編譯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容