1

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

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

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

4

1 回答 1

0

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

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

据我所知,网上最好的 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;   
}
于 2013-10-09T04:15:37.410 回答