交错索引缓冲区是否可以用于骨骼动画,是否可以优化算法



这是两个问题,涉及同一个主题。

我最近制作了一个 obj 加载器,它从 obj 数据创建一个交错索引缓冲区。它工作正常,但对于大型模型,加载单个网格可能需要几分钟,因为这种缓冲区格式的关键部分是;非唯一索引可以在索引数组中多次引用,因此无需两次添加相同的索引数据。问题在于,测试索引是否唯一涉及针对其他索引数据对其进行测试,对于大文件,这可能需要几分钟才能计算。有没有办法加快速度?我应该跳过唯一索引检查吗?或者我应该采用这段代码并使用它来基于 obj 创建我自己的文件,以便我可以将数据直接转储到程序中?

将来我想在我的程序中改编一个动画元素(使用库导入 collada 数据(,尽管我很难理解动画网格,但我一直相信基于 n 个权重,顶点是在顶点着色器中操纵的,所以我们能不能告诉每个索引它受哪些骨骼影响并在着色器中更新它?还是我误解了这个过程?

如果您真的确定速度减慢是唯一的索引检查,我建议您让预处理代码将其结果作为二进制数据写到您加载的文件中,而不是 OBJ 文件 - 您只需将预处理代码复制粘贴到命令行实用程序中,将生成的文件放入项目中,然后使用 NSData 获取其内容并将 VBO 设置为数据。没有代码,很难说它是否可以加速 - 你如何执行检查?你也许可以使用字典来获取每次检查的 O(1( 查找,或者如果几何体真的很大,也许多线程会有所帮助。

您对如何在着色器中通常如何实现骨骼动画是正确的。下面是我编写的着色器中的一些代码,可能会对您有所帮助。请注意,它仅支持 16 个骨骼,并且只有三个骨骼可以影响每个点。

据我所知,网络上最好的 COLLADA 动画教程是这个(http://www.wazim.com/Collada_Tutorial_1.htm(,尽管作者的英语不是最好的,他的代码是 C++ 和 C#。至于影响,您可能会将其设为顶点属性并将其添加到交错的 VBO 中。

uniform mat4 modelViewProjectionMatrix;
attribute vec3 boneWeights;
attribute vec4 position
void main()
{
vec4 animatedPosition;
animatedPosition = ((position * boneMatrices[int(boneIndex[0])])) * boneWeights[0];
animatedPosition += ((position * boneMatrices[int(boneIndex[1])])) * boneWeights[1];
animatedPosition += ((position * boneMatrices[int(boneIndex[2])])) * boneWeights[2];
gl_Position = modelViewProjectionMatrix * animatedPosition;   
}

最新更新