如何在iPhone SDK中使用OpenGL ES着色器

3
我对基于逆向运动学和变形目标的实时角色动画有着执着的追求。
我使用了一个名为Animata的开源(基于FLTK)IK链式动画程序,取得了一定的进展。我甚至将他们的渲染代码移植到了不同的平台上(Java/Processing和iPhone)alt video http://ats.vimeo.com/612/732/61273232_100.jpg video 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;
}

有人知道我该如何使用这个片段吗?它的上下文非常少。我认为这是我想要在GPU上执行的基于骨骼的IK链动画所需做的,但我不确定。

1个回答

3
我已经做了很多研究,现在感觉我几乎能理解这一切了。
我学到的第一个重要课程是OpenGL 1.1和OpenGL 2.0非常不同。在v2.0中,原则似乎是将数据数组馈送到GPU并使用着色器渲染细节。这与v1.1不同,在v1.1中,更多的应用程序代码使用pushmatrix/popmatrix和各种内联绘图命令来完成。
这里有一系列介绍最新OpenGL方法的博客文章:Joe's Blog: An intro to modern OpenGL 上面描述的顶点着色器是在一组顶点位置上运行变换的。'attribute'成员是每个顶点的,而'uniform'成员是所有顶点共同的。
为使此代码工作,您需要提供一个向量位置数组(原始位置,我猜),对应的关节和权重数组(其他属性变量),并且该着色器将根据它们附加的关节重新定位输入顶点。
统一变量首先与提供的纹理图像相关,以及投影矩阵,我认为这与将世界坐标系转换为特定要求更合适的东西有关。
将其与iPhone开发联系起来,最好的做法是创建一个OpenGL ES模板项目,并注意两个不同的渲染类。一个用于更线性和过时的OpenGL 1.1,另一个用于OpenGL 2.0。就个人而言,我正在放弃GL1.1代码,因为它主要适用于旧的iPhone设备,而且由于我针对的是iPad,所以它已经不再相关了。我可以使用GL2.0上的GPU着色器获得更好的性能。

值得一提的是,还可以看看随附在苹果开发工具中的OpenGL Shader Builder。请注意,添加一个uniform变量不会使它出现为您可以操作的内容,直到您实际在着色器代码中引用此变量(这让我困惑了很长时间)。Joe的大多数示例都可以在Shader Builder中进行测试,因此您不一定需要编写所有C代码来理解原理。 - Michael Forrest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接