【问题标题】:Can an interleaved index buffer be used for skeletal animation and can the algorithm be optimized?交错索引缓冲区可以用于骨骼动画吗?算法可以优化吗?
【发布时间】:2013-10-09 22:13:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: iphone ios objective-c opengl-es


    【解决方案1】:

    如果您确实确定减速是唯一索引检查,我建议您让预处理代码将其结果作为二进制数据写入您加载的文件而不是 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;   
    }
    

    【讨论】:

    • 对不起,我认为代码会自我解释pastebin.com/ffrmeF8K
    • 好吧,我只是让我的代码假设所有索引都是唯一的,并且它会立即加载内容。我决定为了加快速度,我只检查当前索引后面的 4 个索引,因为通常重复项位于该空间内。
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2022-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多