實(shí)現(xiàn)一個(gè)GLKView的實(shí)現(xiàn):


每個(gè)UIView實(shí)例都有一個(gè)相關(guān)聯(lián)的被CocoaTouch按需自動(dòng)創(chuàng)建的Core Animation層。Cocoa Touch 會(huì)調(diào)用“+layer class”方法來(lái)確定創(chuàng)建什么類型的層。但Cocoa Touch調(diào)用上面的方法時(shí),告訴要使用一個(gè)CAEAGLLayer類的實(shí)例,而不是原先的CALayer。CAEAGLLayer是Core Animation 提供的標(biāo)準(zhǔn)層類之一。CAEAGLLayer會(huì)與一個(gè)OpenGLES的幀緩存共享它的像素顏色倉(cāng)庫(kù)。

設(shè)置kEAGLDrawablePropertyRetainedBacking為NO,不要試圖保留任何以前繪制的圖像以留作后用。
設(shè)置kEAGLDrawablePropertyColorFormat為kEAGLColorFormatRGBA8,是告訴Core Animation 用8位來(lái)保存層內(nèi)的每個(gè)像素的每個(gè)顏色元素的值。

AGLKView實(shí)例需要?jiǎng)?chuàng)建和配置一個(gè)幀緩存和一個(gè)像素顏色渲染緩存來(lái)與視圖的Core Animation 層一起使用,所以設(shè)置上下文會(huì)有一些副作用。由于上下文保存緩存,因此修改視圖的上下文會(huì)導(dǎo)致先前創(chuàng)建的緩存全部失效,并需要?jiǎng)?chuàng)建和配置新的緩存。
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,colorRenderBuffer);
void glFramebufferRenderbuffer (GLenumtarget,GLenumattachment,GLenumrenderbuffertarget,GLuintrenderbuffer)
函數(shù)用來(lái)配置當(dāng)前綁定的幀緩存以便在colorRenderBuffer中保存渲染的像素顏色。

設(shè)置視圖的上下文為當(dāng)前上下文,告訴OpenGLES讓渲染填滿整個(gè)幀緩存,調(diào)用視圖的“drawRect”方法來(lái)實(shí)現(xiàn)OpenGLES函數(shù)真正的繪圖,然后讓上下文調(diào)整外觀并使用Core Animation 合成器把幀緩存的像素顏色渲染緩存與其他相關(guān)層結(jié)合起來(lái)。
glViewport(0,0,self.drawableWidth,self.drawableHeight);
void glViewport (GLint x,GLint y,GLsizei width,GLsizei height);
函數(shù)可以用來(lái)控制渲染至幀緩存的子集,但是這個(gè)例子中使用的是整個(gè)幀緩存。

通過(guò)代理方法實(shí)現(xiàn)繪圖。

任何在接收到視圖重新調(diào)整大小的消息時(shí),Cocoa Touch都會(huì)調(diào)用上面的layoutSubviews方法。視圖附屬的幀緩存和像素顏色渲染緩存取決于視圖的尺寸。視圖會(huì)自動(dòng)的調(diào)整相關(guān)層的尺寸。上下文的renderbufferStorage方法會(huì)調(diào)整視圖的緩存的尺寸以匹配層的新尺寸。

drawableWidth和drawableHeight方法是它們各自屬性的訪問(wèn)器。它們被實(shí)現(xiàn)用來(lái)通過(guò)OpenGLES的glGetRenderbufferParameteriv方法獲取和返回當(dāng)前上下文的幀緩存的像素顏色渲染緩存的尺寸。

回收context。

AGLKViewController類似于GLKViewController,使用一個(gè)Core Animation CADisplayLink對(duì)象來(lái)調(diào)度和執(zhí)行與控制器相關(guān)聯(lián)的視圖的周期性重繪。
GLKBaseEffect類隱藏了iOS所支持的OpenGLES版本之間的許多不同。當(dāng)使用OpenGLES2.0時(shí),GLKBaseEffect會(huì)生成直接在GPU上運(yùn)行的Shading Language程序。GLKBaseEffect使程序員專注于應(yīng)用的功能和圖形概念,而無(wú)需學(xué)習(xí)Shading Language。