这是两个问题,涉及同一主题。
我最近创建了一个obj加载器,它从obj数据创建一个交错索引缓冲区。它工作正常,但对于大型模型,加载单个网格可能需要几分钟,因为此缓冲区格式的关键部分是;非唯一索引可以在索引数组中多次引用,因此您不需要两次添加相同的索引数据。问题是,要测试索引是否唯一,需要针对其他索引数据进行测试,而对于大文件,这可能需要几分钟来计算。有没有办法加快速度?我应该跳过唯一索引检查吗?或者我应该使用此代码并使用它来创建基于obj的我自己的文件,以便我可以直接将数据转储到程序中?
将来我想在我的程序中调整动画元素(使用库导入collada数据),虽然我无法理解动画网格,但我始终认为基于n权重,在顶点着色器中操纵顶点,因此我们不能告诉每个索引它受影响的骨骼并在着色器中更新它?或者我误解了这个过程?
答案 0 :(得分:0)
如果你真的确定减速是唯一的索引检查我建议你让你的预处理代码将其结果作为二进制数据写入你加载的文件而不是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;
}