讓硬件為我們工作(2)GLKView的分析

實(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。

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. iOS操作系統(tǒng)不會(huì)不會(huì)讓?xiě)?yīng)用向前幀緩存和后幀緩存繪圖,也不會(huì)讓?xiě)?yīng)用直接控制前幀緩存和后幀緩存之間的切換。操作...
    碧玉小瑕閱讀 310評(píng)論 0 0
  • 繪制像素到屏幕上 answer-huang22 Mar 2014 分享文章 一個(gè)像素是如何繪制到屏幕上去的?有很多...
    阿貍旅途T恤閱讀 1,774評(píng)論 0 7
  • 卷首語(yǔ) 歡迎來(lái)到 objc.io 的第三期! 這一期都是關(guān)于視圖層的。當(dāng)然視圖層有很多方面,我們需要把它們縮小到幾...
    評(píng)評(píng)分分閱讀 1,933評(píng)論 0 18
  • Core Animation基礎(chǔ) Core Animation 利用了硬件加速和架構(gòu)上的優(yōu)化來(lái)實(shí)現(xiàn)快速渲染和實(shí)時(shí)動(dòng)...
    獨(dú)木舟的木閱讀 1,712評(píng)論 0 3
  • 有很多種framework以及很多種方法的組合可以在屏幕上渲染UI元素,我們?cè)谶@里討論這個(gè)過(guò)程中發(fā)生的事情,希望這...
    縱橫而樂(lè)閱讀 4,705評(píng)論 4 25

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