代码之家  ›  专栏  ›  技术社区  ›  surya

计算Hirerachy最终骨骼矩阵时并行骨骼矩阵计算

  •  1
  • surya  · 技术社区  · 8 年前

    是否有办法优化代码?有人试图把这个计算转移到GPU上吗?

    void Mesh::ReadNodeHeirarchy(float AnimationTime, const aiNode* pNode, const Matrix4f& ParentTransform)
        { 
            string NodeName(pNode->mName.data);
    
            const aiAnimation* pAnimation = m_pScene->mAnimations[0];
    
            Matrix4f NodeTransformation(pNode->mTransformation);
    
            const aiNodeAnim* pNodeAnim = FindNodeAnim(pAnimation, NodeName);
    
            if (pNodeAnim) {
                // Interpolate scaling and generate scaling transformation matrix
                aiVector3D Scaling;
                CalcInterpolatedScaling(Scaling, AnimationTime, pNodeAnim);
                Matrix4f ScalingM;
                ScalingM.InitScaleTransform(Scaling.x, Scaling.y, Scaling.z);
    
                // Interpolate rotation and generate rotation transformation matrix
                aiQuaternion RotationQ;
                CalcInterpolatedRotation(RotationQ, AnimationTime, pNodeAnim); 
                Matrix4f RotationM = Matrix4f(RotationQ.GetMatrix());
    
                // Interpolate translation and generate translation transformation matrix
                aiVector3D Translation;
                CalcInterpolatedPosition(Translation, AnimationTime, pNodeAnim);
                Matrix4f TranslationM;
                TranslationM.InitTranslationTransform(Translation.x, Translation.y, Translation.z);
    
                // Combine the above transformations
                NodeTransformation = TranslationM * RotationM * ScalingM;
            }
    
            Matrix4f GlobalTransformation = ParentTransform * NodeTransformation;
    
            if (m_BoneMapping.find(NodeName) != m_BoneMapping.end()) {
                uint BoneIndex = m_BoneMapping[NodeName];
                m_BoneInfo[BoneIndex].FinalTransformation = m_GlobalInverseTransform * GlobalTransformation * 
                                                            m_BoneInfo[BoneIndex].BoneOffset;
            }
    
            for (uint i = 0 ; i < pNode->mNumChildren ; i++) {
                ReadNodeHeirarchy(AnimationTime, pNode->mChildren[i], GlobalTransformation);
            }
        }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   codetiger    8 年前

    您的代码是递归的,GPU在运行递归代码或循环语句方面非常糟糕。因此,您必须以这样一种方式调整您的逻辑,即GPU可以接受它并为您提供更好的性能。

    你实际上混淆了两个不同的问题。

    1) 计算所有节点的全局矩阵,该矩阵必须基于场景图递归。这是CPU问题,而不是GPU问题,因为递归是解决这个问题的最佳方法。

    2) 实际插值和矢量数学。这可以通过使用SIMD优化代码来加快速度,该代码将为所有矢量数学运算提供4倍的速度提升。

    对于您的问题,我建议使用SIMD优化。

    注意:我写的东西与你在这里发布的内容非常相似。使用Assimp和OpenGLES for iOS;安卓