2010-07-04 81 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