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

时间:2016-09-14 11:34:50

标签: opengl-es-2.0

ReadNodeHeirarchy找到translate,rotate&的插值。在给定的TimeStamp中缩放,因此每次Frame计算这些值时,将它们馈送到GPU以进行每个骨骼的最终转换。 无论如何优化代码?有人试图将此计算移动到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 个答案:

答案 0 :(得分:1)

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

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

1)计算所有节点的全局矩阵,必须根据场景图递归。这是一个CPU问题而不是GPU的问题,因为递归它是最好的方法。

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

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

注意:我写的内容与您在此处发布的内容非常相似。使用Assimp和OpenGLES for iOS&amp; Android系统。