OpenGL ES (Swift) Dev 2

上一節(jié)OpenGL的HelloWorld中俱病,初步認識OpenGL晦炊,接著將對上節(jié)內(nèi)容的中EAGLContext和GLKVertexAttribArrayBuffer進行封裝第岖,利用封裝的函數(shù)減少應用需要調用OpenSE函數(shù)的數(shù)量劣摇,這同時也是減少緩存管理中的7個步驟相關的錯誤和代碼的數(shù)量:

7個步驟:

  1. 生成(Generate)
  2. 綁定(Bind)
  3. 緩存數(shù)據(jù)(Buffer Data)
  4. 啟用(Enable)或者禁用(Disable)
  5. 設置指針(Set Pointers)
  6. 繪圖(Draw)
  7. 刪除(Delete)

EAGLContext的封裝類AGLKContext

這個相信不用注釋一樣能看得懂了~~~~

class AGLKContext: EAGLContext {
    
    var clearColor: GLKVector4 {
        set {
            self.clearColor = newValue
            glClearColor(
                newValue.r,
                newValue.g,
                newValue.b,
                newValue.a);
        }
        get {
            return self.clearColor
        }
    }
    func clear(mask: GLbitfield) {
        glClear(mask);
    }
    func disable(capability: GLenum) {
        glDisable(capability);
    }
    func enable(capability: GLenum) {
        glEnable(capability);
    }
    func setBlendSourceFunction (sfactor: GLenum, dfactor: GLenum) {
        glBlendFunc(sfactor, dfactor);
    }
}

GLKVertexAttribArrayBuffer的封裝類AGLKVertexAttribArrayBuffer

以下代碼每一步都有相應的注釋~~~~主要還是要考慮到代碼的重用才進行封裝刷后。

enum AGLKVertexAttrib: GLuint {
    case AGLKVertexAttribPosition = 0
    case AGLKVertexAttribNormal = 1
    case AGLKVertexAttribColor = 2
    case AGLKVertexAttribTexCoord0 = 3
    case AGLKVertexAttribTexCoord1 = 4
}

//封裝頂點數(shù)組緩存
class AGLKVertexAttribArrayBuffer: NSObject {
    //步幅吃靠,表示每個頂點需要多少個字節(jié)
    var stride = GLsizei()
    //緩存大小
    var bufferSizeBytes = GLsizeiptr()
    //緩存唯一標識
    var bufferId = GLuint()
    
    
    
    /**
     創(chuàng)建頂點數(shù)組緩存
     
     - parameter stride:           步幅
     - parameter numberOfVertices: Vertices大小
     - parameter bytes:            Vertices內(nèi)存地址
     - parameter usage:            是否緩存在GPU
     
     */
    func initWithAttribStride(stride: GLsizei, numberOfVertices: GLsizei, dataPtr: UnsafePointer<Void>, usage: GLenum) {
        self.stride = stride
        bufferSizeBytes = Int(stride) * Int(numberOfVertices);
        
        glGenBuffers(1, &bufferId)
        glBindBuffer(GLenum(GL_ARRAY_BUFFER), self.bufferId)
        glBufferData(
            GLenum(GL_ARRAY_BUFFER),
            bufferSizeBytes,
            dataPtr,
            usage
        )
    }
    
    //重新加載緩存數(shù)據(jù)
    func reinitWithAttribStride(stride: GLsizei, numberOfVertices:GLsizei, dataPtr:  UnsafePointer<Void>) {
        self.stride = stride;
        bufferSizeBytes = Int(stride) * Int(numberOfVertices);
        
        glBindBuffer(GLenum(GL_ARRAY_BUFFER),
                     self.bufferId);
        glBufferData(
            GLenum(GL_ARRAY_BUFFER),
            bufferSizeBytes,
            dataPtr,
            GLenum(GL_DYNAMIC_DRAW)
        );
    }
    
    /**
     Description
     
     - parameter index:               VertexAttrib
     - parameter numberOfCoordinates: 坐標軸數(shù)
     - parameter attribOffset:        從開始的每個頂點偏移
     - parameter shouldEnable:        啟用(Enable)或者禁用(Disable)
     */
    func prepareToDrawWithAttrib(vertexAttrib: GLuint, numberOfCoordinates: GLint, attribOffset: GLsizeiptr, shouldEnable: Bool) {
    
        glBindBuffer(GLenum(GL_ARRAY_BUFFER), self.bufferId);
        
        if(shouldEnable)
        {
            glEnableVertexAttribArray(vertexAttrib)
        }
        
        glVertexAttribPointer(         
            vertexAttrib,
            numberOfCoordinates,                // 坐標軸數(shù)
            GLenum(GL_FLOAT),                   // 數(shù)據(jù)類型
            GLboolean(UInt8(GL_FALSE)),
            self.stride,
            nil + attribOffset);                // 從開始的每個頂點偏移
    }
    
    //繪制圖片
    func drawArrayWithMode(mode:GLenum, startVertexIndex: GLint, numberOfVertices: GLsizei) {
        glDrawArrays(mode, startVertexIndex, numberOfVertices);
    }
    
    //刪除緩存
    deinit {
        if 0 != bufferId {
            glDeleteBuffers (1, &bufferId);
            bufferId = 0;
        }
    }
    
}

接口調用例子

self.vertextBuffer.initWithAttribStride(
        GLsizei(sizeofValue(vertices[0])),
        numberOfVertices: GLsizei(vertices.count),
        dataPtr: vertices,
        usage:GLenum(GL_STATIC_DRAW)
    )
self.vertextBuffer.prepareToDrawWithAttrib(
    AGLKVertexAttrib.AGLKVertexAttribPosition.rawValue,
    numberOfCoordinates: 3,
    attribOffset:0,
    shouldEnable: true
)
self.vertextBuffer.drawArrayWithMode(
    GLenum(GL_TRIANGLE_FAN),
    startVertexIndex: 0,
    numberOfVertices:
    GLsizei(vertices.count)
)

詳細的的調用例子請參看源碼硫眨。
源碼點這里,喜歡就關注吧巢块,持續(xù)更新中礁阁。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市族奢,隨后出現(xiàn)的幾起案子姥闭,更是在濱河造成了極大的恐慌,老刑警劉巖越走,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棚品,死亡現(xiàn)場離奇詭異靠欢,居然都是意外死亡,警方通過查閱死者的電腦和手機铜跑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門门怪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锅纺,你說我怎么就攤上這事掷空。” “怎么了囤锉?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵坦弟,是天一觀的道長。 經(jīng)常有香客問我官地,道長酿傍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任区丑,我火速辦了婚禮拧粪,結果婚禮上修陡,老公的妹妹穿的比我還像新娘沧侥。我一直安慰自己,他們只是感情好魄鸦,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布宴杀。 她就那樣靜靜地躺著,像睡著了一般拾因。 火紅的嫁衣襯著肌膚如雪旺罢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天绢记,我揣著相機與錄音扁达,去河邊找鬼。 笑死蠢熄,一個胖子當著我的面吹牛跪解,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播签孔,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼叉讥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饥追?” 一聲冷哼從身側響起图仓,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎但绕,沒想到半個月后救崔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年六孵,在試婚紗的時候發(fā)現(xiàn)自己被綠了碳竟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡狸臣,死狀恐怖莹桅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烛亦,我是刑警寧澤诈泼,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站煤禽,受9級特大地震影響铐达,放射性物質發(fā)生泄漏。R本人自食惡果不足惜檬果,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一瓮孙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧选脊,春花似錦杭抠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钝的,卻和暖如春翁垂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硝桩。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工沿猜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碗脊。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓啼肩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親望薄。 傳聞我的和親對象是個殘疾皇子疟游,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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