2015年4月5日 星期日

Android 魔術方塊開發筆記(二) shader以及繪製三角形

接下來這邊對C不熟悉的人可能會痛苦一點了
OpenGL ES的語法其實都是直接CALL native Function
跟JAVA的思維不一樣

1. 建立3D座標

這裡所繪製的是3維座標,
我們要設定一點就必須給他x,y,z座標
以下triangleCoords就代表了一個三角形的3個點的座標

要繪製圖形除了座標之外還需要顏色
跟Android resource的順序有點不太一樣,這邊是RGBA
而且範圍在0.0~1.0之間

Android 底層閱讀Byte的順序可能與Java不一樣
我們要傳送給Opengl就要先轉成ByteBuffer
並設定為native order
才能讓Opengl理解

2. OpenGL ES Shading Language


如上圖
Shading Language會在橘色區塊中執行
這邊已經很底層的元件了
我們必須將他撰寫成String
再交給OpenGL去編譯
----> GLES20.glCompileShader(shader)

這邊所使用的是最基本用法

SHADER_CODE_VERTEX
用來處理點座標
SHADER_CODE_FRAGMENT
用來處理渲染效果

這邊的vPosition, vColor是我們定義的變數名稱
用來連結openGL ES及我們撰寫的java

gl_Position, gl_FragColor則是openGL ES所認得的變數名稱
我們經過運算後必需要傳到這些變數
才能顯示出來

其他部分有興趣的可以參考SPEC


如果只有接觸過上層程式語言的人可能會很納悶
為什麼這邊都是用int來進行操作
其實這邊的int可以把它當成物件的ID
OpenGL ES 將會根據這些ID做相對應的處理

這邊就不一行一行解說
從method的名稱就大概知道裡面的作用了

完整程式碼:

3. 建立Triangle class

這邊就結合上面2步
連結我們的3D座標以及Shader

這邊直接看draw()
mProgram 是剛剛GLShaderFactory裡得到的ID
藉由他我可以拿到vPosition, vColor的ID(positionHandle, colorHandle)
再來呼叫glVertexAttribPointer(),glUniform4fv()
將數值帶進去
最後呼叫glDrawArrays()
三角形就出來啦~~

還有一步



沒有留言:

張貼留言