C++:动画:法线:如何处理大量法线并在动画更新期间更新它们?

标签 c++ animation normals

我的代码(用 C++ 编码)在处理更新模型法线的 for 循环中存在瓶颈。我用来测试的模型有大约 ~2.2k 个顶点(指示),工作正常并且在 60 fps 限制下工作,但法线与指示器(~12k)一样多。代码按预期工作,但由于必须更新的法线数量,此 for 循环花费的时间太长。

信息从Maya API中导出并存储为我的项目可以读取的文件格式(我的项目读取文件没有问题;一切正确)。

有什么我没有考虑过的,可以减少它必须计算的法线数量吗? AAA 中人们用什么技巧来处理这样的问题?它可以在我忽略的 Maya API 级别进行优化吗?任何其他可能有帮助的建议将不胜感激。

我以前搜索过答案,但我无法摆脱与我的问题无关的“法线贴图”。 >.>;

提前致谢! :)

=============================================

请求的代码块:

        // Transform and save our normals.
        for( unsigned int i = 0; i < p_mesh_data->getNormalCount(); ++i )
        {
            Quaternion total_rotation;

            unsigned int index = p_mesh_data->getNormalToVertex( i );
            for( unsigned int j = 0; j < p_skeleton->getJointCount(); ++j )
            {
                JointInfluence influence = p_mesh_data->getInfluence( index * p_skeleton->getJointCount() + j );

                total_rotation = total_rotation + ( rotations[influence.joint_id] * influence.weight );
            }

            p_normals[i] = Matrix( total_rotation ).transform( p_mesh_data->getNormal( i ) );
        }

最佳答案

查看数据并进行更多研究后,我清除了小于 0.001f 的权重(基本上任何没有影响的权重),这减少了更新框架所需的大部分循环。现在它处于舒适的平均 16 毫秒。

对于遇到相同问题的任何其他人,清除不必要的影响是必须的,以便在复杂/高多边形模型中保持高帧率。在简单的几何体上,这可能不需要。

感谢所有花时间的人! :)

关于C++:动画:法线:如何处理大量法线并在动画更新期间更新它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26241354/

相关文章:

c++ - 什么是 'delete' 'new' 数据/对象的安全方法?

C++奇怪的执行逻辑

css - SVG 动画标志

glsl - 在着色器中旋转法线

c++ - 当您在 C 中定义一个值时,编译器如何选择数据类型

c++ - 如何在 emacs 中使用公司模式、irony 后端和 irony header

javascript - JQuery BorderRadius 在 mouseout 中不执行动画

javascript - jQuery( document ).ready() + 等待焦点

objective-c - 在 OpenGL 中绘制法线的正确方法?