
使用 英特尔 流式 SIMD 扩展 优化 动画 模型 的 渲染流水线作者JMP van WaverenId SoftwareInc.原文名称Optimizing the Rendering Pipeline of Animated Models Using the Intel Streaming SIMD Extensions介绍以下 文章 描述了 渲染管道中使用的 各个 例程以及如何 使用 英特尔 Streaming SIMD 扩展 进行 优化。今天的大部分电脑游戏都带有 实时照明和 阴影 的 动画多边形 模型。电脑游戏DOOM * III2004年8月和 Quake * 42005年10月也不例外。两台电脑游戏都使用 骨架动画系统。通常被称为“皮肤”的 多边形网格 连续地 改变形状其中底层结构通常被称为“bones”。?通过动画化骨骼skin 被转化。将skin转变的过程称为“skining加壳”。我自己 给按的名字两个游戏也使用 阴影卷 定义在 遮挡物阴影的 空间中的 区域。阴影体积 由包含 多边形封堵器阴影的 体积的 多边形边界 表示 定义。以下文章概述了 SIMD优化 的 动画模型 渲染流水线其性能与电脑游戏DOOM III中使用的 性能相当。这个改进的渲染流水线在计算机游戏Quake 4中实现。大部分渲染流水线在CPU上运行而管道中的几个步骤可以运行在当今许多显卡上可用的GPU上。然而在CPU上运行大部分管道可以提高 广泛系统的兼容性。较旧的系统可能具有不支持在GPU上执行动画和 skining加壳 的必要功能的图形卡如GeForce2和GeForce4MX。允许在GPU上进行皮肤化的显卡可能具有将大型“”模型架”模型 细分为 多个 网格的限制从而 降低效率。此外需要后变换的皮肤来构建阴影体并且当前的图形卡在处理之后不允许检索此数据。阴影体积结构可以完全卸载到GPU但是如果闭塞器具有高三角形数量 或者 如果有 大量 阴影投射光源则这可能无法提高性能。由于这些原因电脑游戏DOOM III和Quake 4运行CPU上的大部分管道允许游戏在各种系统配置下运行。此外在CPU上运行的流水线几乎没有任何限制SIMD优化使得流水线与部分GPU实现相竞争。渲染管道可以细分为 四个 一般 阶段。这些阶段是 动画皮肤阴影体积建设 和 裁剪 和光栅化。下图显示了这些阶段为大型浅灰色块。每个阶段被细分为更小的步骤其中处理的数据以倾斜框显示并且处理该数据的例程显示在较暗的灰色框中。这些框的黑色角落中的数字对应于 底部描述例程的文章以及如何使用英特尔Streaming SIMD扩展进行优化。动画系统可以混合一个或多个动画。在上图中仅显示了两个动画但是可以将更多的动画混合在一起以产生复杂的运动混合。动画是一系列动画帧。每个动画框架将骨架的姿态定义为使用四元数描述方位的关节位置 和 方向的列表。关节的位置和方向与骨骼层次结构中关节的父母相关。点击图片查看大图。此处图片暂无……系统从动画中抽取时间t0和t1的两帧使得当前时间在t0和t1之间。然后系统在这两个帧之间进行插值以获得当前时间的骨架姿势。然后将正在播放的所有动画的内插帧混合在一起以获得骨架的最终姿态。接下来将 关节位置 和 四元数 变换为 3×4 矩阵。此外联合矩阵 用其 parents的 联合 矩阵 进行变换以在 模型空间 中创建 skeleton。也许很多 动画 方面的 概念 源于 医学 3D视觉效果分析得到的但是很多 表述在其他领域换个说法或者理论之类有的我自己都感觉很不爽点击图片查看大图。 图片请参照原文........模型空间中的skeleton 用于为通常称为 skining 应该是 skining 我自己 译为 蒙壳的三角形 网格 生成 动画。基于三角形网格是用于 渲染 还是仅用于创建阴影体 或 进行 碰撞检测系统可以决定最佳的skining 方法。如果模型没有使用漫反射法线和 法线贴图则通常不需要在顶点位置计算 正态 和 切线矢量。如果不需要可以通过不动画化 和 计算这些附加顶点属性来节省 时间。确定计算正态和切向矢量的skining 方法 要求将 skeleton 的关节进行 变形使得它们 相对于被变换以 创建 动画 网格 的 基础姿势的关节。点击图片查看大图。图片暂无……在下一阶段为与三角形网格相互作用的 每个 光源 构建 阴影体。阴影体 定义空间中具有 附加几何 的 对象空间 中 遮挡物 阴影 的 空间区域。可以为 点光源聚光灯 和 定向光源 构建 阴影体并始终产生 像素精确 但 硬 的阴影。在 构造 任何 阴影体 之前需要导出 三角形网格 中 三角形 的 平面方程。这些 平面方程 用于 找到 面向 或 远离 光源的 三角形并确定 几何图形 的 阴影轮廓 边缘。这样的 轮廓边缘 是 点燃 和 未点燃三角形 之间的边界。 此处 翻译可能有误……点击图片 查看 大图。图片暂无 ……在最后一个阶段通常在GPU上运行三角形网格 和 阴影体 被 裁剪和 光栅化。我自己 十分 怀疑有的 这个理论 来源于 织布机还是投影仪电影放映机阴影体 被渲染到 模板缓冲区当在屏幕上 渲染三角形网格 以 确定 哪些像素处于 阴影 时 被 查询。要确定空间中 三角形网格 的 阴影区域模板缓冲区 首先被 清除为 全零。然后用适当的深度测试将三角形网格的阴影体 呈现到模板缓冲区。前面的阴影体积三角形增量和 背面三角形减少 模板缓冲区像素。现在在阴影中 考虑了 具有不等于 零的 模板缓冲区值的 像素。下表显示了在渲染管道中使用的所有SIMD优化例程的概述。该表显示了90nm技术上的Intel®Pentium®4处理器上的例程的热缓存 时钟 周期 计数。将例程的 加速因子 与 执行 相同计算 的 C / C 中的 参考实现 进行比较。但是C / C 源代码编译成在基于x86 FPU的常规堆栈上运行的代码。前面的阴影体积三角形增量和背面三角形 减少模板缓冲区像素。现在在阴影中 考虑了 模板缓冲区值 不等于零的像素。下表显示了在渲染管道中使用的所有SIMD优化例程的概述。该表显示了90nm技术上的Intel®Pentium®4处理器上的例程的 热缓存时钟周期计数。将例程的加速因子与执行相同计算的C / C 中的参考实现进行比较。但是C / C 源代码 编译成 在基于x86 FPU的常规堆栈上 运行的代码。前面的阴影体积三角形增量和背面三角形 减少 模板缓冲区像素。现在在阴影中考虑了 具有不等于零的 模板缓冲区值 的 像素。下表显示了在渲染管道中使用的所有SIMD优化例程的概述。该表显示了90nm技术上的Intel®Pentium®4处理器上的例程的热缓存时钟周期计数。将例程的加速因子与执行相同计算的C / C 中的参考实现进行比较。但是C / C 源代码编译成在基于x86 FPU的常规堆栈上 运行的代码。下表显示了在渲染管道中使用的所有SIMD优化例程的概述。该表显示了90nm技术上的Intel®Pentium®4处理器上的例程的热缓存时钟周期计数。将例程的加速因子与 执行 相同 计算 的C / C 中的参考实现进行比较。但是C / C 源代码编译成在基于x86 FPU的常规堆栈上运行的代码。下表显示了在渲染管道中使用的所有SIMD优化例程的概述。该表显示了90nm技术上的Intel®Pentium®4处理器上的例程的热缓存时钟周期计数。将例程的加速因子与执行相同计算的C / C 中的参考实现进行 比较。但是C / C 源代码编译成在基于x86 FPU的常规堆栈上运行 的 代码。常规加速系数说明每次迭代每次迭代的元素数迭代总指示总时钟周期每个元件的时钟周期每个指令的时钟周期SlerpJoints7.92134256545491315171282.42.411LerpJoints4.813242563381952848521.61.563ConvertJointQuatsToJointMats1.834110243482334362341.00.987ConvertJointMatsToJointQuats2.420742565300373710721.41.391TransformSkeleton3.045110244609354297531.21.178UntransformSkeleton2.848110244916457285561.21.165TransformJoints3.041110244199548906481.21.165TransformVerts3.039110243994643956431.11.100TransformVertsSSE33.133110243380241963411.21.241TransformVertsAndTangents2.680110248193089775881.11.096TransformVertsAndTangentsSSE32.861110246247481855801.31.310DeriveTrianglePlanes4.212142563099036128351.21.165CountFacing59.231 4256 165 41963830.32.01.954CountFacingCull2.13743361245413883101.11.115CreateSilTriangles1.27045043530036901181.01.045CreateCapTriangles2.45443361817014205110.80.782所有呈现的例程假设被处理的数据都在缓存中。可选的预取指令可以添加到例程中。然而预取距离不仅取决于CPU类型还取决于CPU速度内存速度缓存速度缓存级别数以及其他几个因素。因此在所有系统配置 上 都没有 最佳的预取距离。英特尔手册 提供了使用预取指令优化特定配置的 内存访问的 指标。通常可以通过一次将模型推下一个 管道来 提高缓存 的使用率。因此流水线中的一个步骤的结果在流水线的下一步骤中从高速缓存取出后通过 缓存 和 快速写入存储器。与130nm技术上的较早的英特尔®奔腾®4处理器相比在90nm技术的较新英特尔®奔腾®4处理器上执行代码时文章中提供的一些热缓存时钟周期计数略高。首先这些CPU之间的这些热缓存时钟周期差异与所呈现的优化的性能改进无关。90nm技术上的英特尔®奔腾®4处理器具有更深的流水线预期稍高一些的热缓存时钟周期。然而90nm技术上的英特尔®奔腾®4处理器可以提供更高的频率并且由于更长的管道由此架构可实现的频率增加高于热缓存 时钟周期计数 的增加。此外90nm技术上的英特尔®奔腾®4处理器具有许多改进在许多情况下实际上使其在130nm技术上以相同频率运行的英特尔®奔腾®4处理器的性能更好。采用130nm技术的英特尔®奔腾®4处理器90nm技术架构上的英特尔®奔腾®4处理器的一些改进包括较大的缓存。改进的软件和硬件预取。更好的静态和动态分支预测。增加调度程序队列以改进对并行性的利用。认识到更多的指示可能会破坏依赖关系链。减少一些指令的延迟如整数乘法和逐位逻辑移位。新的指令如浮点整型转换截断线程同步指令和流式SIMD扩展3SSE3。130nm技术上的英特尔®奔腾®4处理器从1.6 GHz扩展到3.4 GHz并附带512 kB片上缓存。90nm技术的英特尔®奔腾®4处理器的尺寸为2.4 GHz至3.8 GHz并带有1或2 MB片上缓存。