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()
三角形就出來啦~~
還有一步
SourceCode:
https://github.com/hungyanbin/magicCube
版本:14866f0b92
Reference:
https://www.khronos.org/opengles/2_X/
http://developer.android.com/training/graphics/opengl/shapes.html
沒有留言:
張貼留言