您好,登錄后才能下訂單哦!
自定義ViewController中存在兩組方法,第一組為:
viewDidLoad;
viewDidUnload;
didReceiveMemoryWarning
shouldAutorotateToInterfaceOrientation
這組方法為view的通用方法,方法的定義在UIViewController接口中。
第二組為:
update
drawInRect
setupGL
tearDownGL
loadShaders
compileShader
linkProgram
validateProgram
這組方法為利用opengl繪圖。其中update、drawInRect方法為系統回調方法,其余為opengl的基礎操作方法。如圖1所示,跟蹤程序發現,整個架構底層是一個timer,定時調用GLKViewController的 _updateAndDraw方法,而在_updateAndDraw方法中會依次調用到drawInRect和update方法。其中drawInRect方法的主要邏輯是繪圖,并返回一個 GLKView;update方法主要用于更新游戲信息;其中drawInRect方法也可以在自定義的view中實現,這樣應該至少可以方便地實現同一游戲邏輯下可以使用不同的渲染效果。
圖1
第二組的其余方法揭示了opengl的基本使用方法:
1.EAGLContext 是包含opengl繪圖時所涉及到的狀態信息、命令、資源的上下文環境。從代碼中看,程序把生成的EAGLContext先后掛接到GLKView和opengl層,掛接的方法分別是
GLKView *view = (GLKView *)self.view;
view.context = self.context;
[EAGLContext setCurrentContext:self.context];
2.代碼中展示了兩種opengl渲染方式,一種是使用GLKit渲染,另一種是使用ES2。
使用GLKit渲染的核心想法是使用GLKBaseEffect簡化對opengl的調用,你可以通過GLKBaseEffect的若干屬性對渲染方式進行設定,并在使用opengl渲染之前調用如下方法
[self.effect prepareToDraw];
ES2方式是基于GLSL的,它可以動態加載、編譯、執行GLSL編寫的渲染腳本,其大致的調用順序如下:
1)創建程序對象
通過glCreateProgram創建程序對象。
2)編譯shader
通過glCreateShader創建一個shader對象
讀取shaker腳本內容,并通過glShaderSource把內容與之前創建的shader對象關聯上,讀取文件內容可以通過stringWithContentsOfFile方法實現。
通過glCompileShader方法編譯shader。
通過glGetShaderiv,傳入GL_COMPILE_STATUS參數可以查看編譯狀態。
3)鏈接shader
使用glLinkProgram方法可以鏈接shader程序。
在鏈接shander程序之前還必須做兩樣事情:一個是通過glAttachShader方法把程序對象與編譯好的shader對象做關聯;另一個是通過glBindAttribLocation方法設置屬性位置,這個是方便系統在之后解析綁定數據的時候可以按照正確的約定讀取屬性信息。
通過glGetShaderiv,傳入GL_LINK_STATUS參數可以查看鏈接狀態。
4)運行shader
在繪制的邏輯中,使用glUseProgram方法可以把程序對象關聯到opengl繪圖上下文中
通過glUniformMatrix4fv可以傳遞參數到shader中,具體傳遞的是哪個參數由該方法的第一個參數決定,而第一個參數的具體值可以在鏈接shader之后調用glGetUniformLocation獲取。
做好了上述一切,在調用opengl的繪制方法時,底層會直接使用shader進行繪制。
ps:
1.opengl對外暴漏的是類c語言的接口方式,它按照下面的思維方式處理對象。
1)用戶可以通過系統函數創建一些對象,返回給用戶的只是對象的一個句柄,在opengl里用GLuint類型表示。
2)在調用對象相關方法時有兩種方案,一種是使用方法的參數(一般是第一個參數)指定要操作哪個對象;另一種是通過一些bind方法,把對象綁定在系統底層的環境上下文中,此后所有的函數調用就都跟之前綁定的對象相關。
參考資料:
http://www.ityran.com/article-80-1.html
http://zh.wikipedia.org/wiki/GLSL
http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html
¬
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。