2010-07-04 78 views
3

我對基於逆運動學和變形目標進行實時角色動畫有着迷戀之感。如何在使用iPhone SDK的OpenGL ES中使用着色器

我用Animata,一個開源(基於FLTK,可悲的)IK鏈式動畫程序得到了一個公平的方式。我甚至將他們的渲染代碼移植到各種平臺上(Java/Processing和iPhone)alt video http://ats.vimeo.com/612/732/61273232_100.jpgvideo of Animata renderers

但是,我從來沒有確信他們的代碼是特別優化的,它似乎需要大量的CPU模擬渲染每一幀,這對我來說似乎有點不必要。

我現在開始一個項目,使在iPad上,在很大程度上依賴於實時角色動畫的應用程序,並通過iOS版的文件翻閱我發現了一個代碼段用於「兩成骨剝皮着色器」

// A vertex shader that efficiently implements two bone skinning. 

attribute vec4 a_position; 
attribute float a_joint1, a_joint2; 
attribute float a_weight1, a_weight2; 

uniform mat4 u_skinningMatrix[JOINT_COUNT]; 
uniform mat4 u_modelViewProjectionMatrix; 

void main(void) 
{ 
    vec4 p0 = u_skinningMatrix[int(a_joint1)] * a_position; 
    vec4 p1 = u_skinningMatrix[int(a_joint2)] * a_position; 
    vec4 p = p0 * a_weight1 + p1 * a_weight2; 
    gl_Position = u_modelViewProjectionMatrix * p; 
} 

有人知道我會如何使用這樣的片段?它的情況非常少。我認爲這是我需要做的,以做我想做的IK鏈骨骼動畫,但在GPU上。

回答

3

我做了大量的研究,現在覺得我幾乎明白這是什麼。

我學到的第一個重要教訓是OpenGL 1.1與OpenGL 2.0非常不同。在v2.0中,原理似乎是將數據數組輸入到GPU和用於呈現細節的着色器。這與v1.1截然不同,其中更多的工作是在pushmatrix/popmatrix和各種內聯繪圖命令的普通應用程序代碼中完成的。

一個優秀的系列博客文章介紹最新的方法的OpenGL可在這裏:Joe's Blog: An intro to modern OpenGL

頂點着色器我上面描述是運行在一組頂點位置的變換。 '屬性'成員是每個頂點和'統一'成員在所有頂點中是共同的。

爲了使這個代碼有效,你需要輸入一個向量位置數組(原始位置,我猜),相應的關節和權重數組(其他屬性變量),這個着色器會根據它們的輸入頂點連接關節。

統一變量首先與提供的紋理圖像相關,我認爲投影矩陣與將世界座標系轉換爲更適合特定要求的東西有關。

將這一點與iPhone開發關聯起來,最好的辦法是創建一個OpenGL ES模板項目,並關注兩種不同的渲染類。一個是更線性和過時的OpenGL 1.1,另一個是OpenGL 2.0。就個人而言,我拋棄了GL1.1的代碼,因爲它主要適用於較老的iPhone設備,並且因爲我瞄準的是iPad,所以它不再相關。使用GL2.0,我可以在GPU上使用着色器獲得更好的性能。

+0

同樣值得一看的是Apple開發人員工具中包含的OpenGL Shader Builder。請注意,添加一個統一的變量不會讓它看起來像你可以玩的東西,除非你真的在你的着色器代碼中引用這個變量(那個人讓我撓頭太久)。 Joe的大部分示例都可以在Shader Builder中進行測試,因此您不一定需要編寫所有的C才能使您瞭解原理。 – 2010-08-07 14:26:25