• 其他语言



利用英特尔 SIMD 流指令扩展指令集,优化动画模型的渲染管线
页面和feed选项
打印
收藏此页
Digg此页 | 添加到您的del.icio.us帐号
目录

介绍
下列文章阐述了用于渲染管线的单个例程,以及如何采用英特尔 SIMD 流指令扩展指令集对其进行优化。

作者 Id Software 公司,J.M.P. van Waveren

目前,大部分的电脑游戏利用即时光影技术来渲染动画多边形建模。 《毁灭战士 III(DOOM* III)》(2004 年 8 月推出)以及《雷神之锤 4(Quake* 4)》(2005 年 10 月推出)也不例外。 这两款游戏都采用了骨骼动画系统。 称为"皮肤(skin)"的多边形网格随着称为"骨骼(skeleton)"的底层结构的改变而不断改变。 通过对骨骼进行动画设计,皮肤也随之发生转换。 转换皮肤的过程称为"蒙皮(skinning)"。 这两款游戏还使用了阴影锥(shadow volume)来定义遮蔽物阴影下的区域。 阴影锥被定义为包含多边形遮蔽物阴影在内的多边形边界区域。

下列文章提供了动画模型 SIMD 优化的渲染管线技术的概览,它与游戏 DOOM III 中采用的渲染管线技术作用是相同的,但性能要更加卓越。 这一改进的渲染管线在电脑游戏 Quake 4 中得以实施。尽管管线的多个步骤能够在图形处理单元(GPU)上运行(大多数显卡提供 GPU),但是大部分的渲染管线仍在 CPU 上运行。 在 CPU 上运行大部分管线,可提高在各种系统上的兼容性。 早先系统的显卡(如 GeForce2 和 GeForce4MX)不支持某些在 GPU 上执行动画和蒙皮所必需的特性。 支持在 GPU 上蒙皮的显卡可能具有某些限制,将较大的骨骼模型强制划分为多个网格,而这会降低系统效率。 此外,需要用转换过的皮肤构建阴影锥,但目前的显卡不允许重新获取经过处理的数据。 阴影锥的构建工作可完全由 GPU 承担,但如果遮蔽物存在复杂三角形计数,或者使用了大量的投影光源,这将无法改进性能。 鉴于以上原因,游戏 DOOM III 和 Quake 4 在 CPU 上运行大部分的管线,从而使游戏得以在各种系统配置上运行。 另外,运行于 CPU 上的管线几乎没有任何限制,SIMD 优化使管线可以与(部分)GPU 实施相媲美。

渲染管线可分为四个基本阶段。 分别为动画、蒙皮、构建阴影锥以及裁切和描绘。 右图用大面积的浅灰色块显示了这些阶段。 每个阶段又细分为更小的步骤,斜框为处理的数据,深灰色方框内为处理该数据的例程。 方框黑色拐角处的数字与页面底部的文章相对应,这些文章对例程,以及如何使用英特尔 SIMD 流指令扩展指令集来优化这些例程进行了说明。 蓝色气球显示了,当在采用 90 纳米制程技术的英特尔® 奔腾® 4 处理器上比较活动高速缓存时钟周期时, SIMD 优化例程相对于 C/C++ 参考实施来说,加快了多少倍。


动画系统可以融合一个或多个动画。 右图中仅显示了两个动画,实际上可以把更多的动画结合在一起,来创造复杂的动作。 动画是帧画面的序列。 每个帧画面定义骨骼的一个姿势,作为关节位置和方向的列表,这些方向采用四元数进行说明。 关节的位置和方向与骨骼层次中的父关节有关。



点击查看大图。

系统从动画中取出两个帧(时间 t0 与 t1),从而当前时间位于 t0 和 t1之间。 然后,系统在这两帧之间插入帧,从而为当前时间获取骨骼姿势。 将所有动画的插入帧进行演示,并组合在一起来获得骨骼的最终姿势。 将下一个关节位置和四元数转换成 3x4 的矩阵。 关节矩阵随它们的父关节矩阵一起转换,从而在模型空间创建骨骼。



点击查看大图。

模型空间里的骨骼用来制作三角形网格动画,通常称为蒙皮。 根据三角形网格的用途(如用于渲染、或用于创建阴影锥、或用于冲突检测),系统来决定蒙皮的最佳方式。 如果模型没有采用漫反射贴图、反射贴图和法线贴图进行渲染,则通常不需要计算顶点位置的法向量和切向量。 如果不需要制作动画或计算这些额外的顶点属性,则能够显著节省时间。 计算法向量和切向量的蒙皮方法要求对骨骼关节进行转换,从而使其与基本姿势的关节相关,该基本姿势被转换用来创建动画网格。



点击查看大图。

在下一阶段中,为每个与三角形网格进行相互作用的光源创建阴影锥。 阴影锥定义为在对象空间中,具有额外几何体的遮蔽物阴影空间里的区域。 可为点光源、聚光灯光源以及平行光源创建阴影锥,并通常生成像素精度的阴影而非硬边线的阴影(hard shadow)。 在创建阴影锥之前,需要导出三角形网格中的三角形平面方程。 这些平面方程用来查找朝向或远离光源的三角形,并以此来确定阴影的几何轮廓线。 这些轮廓线是有光线和无光线三角形的边界。



点击查看大图。

最后一个阶段进行三角形网格和阴影锥的裁切和描绘,该阶段通常在 GPU 上运行。 阴影锥被渲染至模板缓冲区,当在屏幕上对三角形网格进行渲染时,询问该模板缓冲区来确定阴影中包含有哪些像素。 为确定三角形网格阴影里的空间区域,首先将模板缓冲区全部清空为零。 然后,采用恰当的深度测试,将三角形网格的阴影锥渲染至模板缓冲区。 朝前的阴影锥三角形增加模板缓冲区的像素,朝后的阴影锥三角形则降低模板缓冲区的像素。 现在考虑阴影中模板缓冲值不为零的像素。

下表为在渲染管线中使用的所有 SIMD 优化例程概览。 该表显示了在采用 90 纳米制程技术的英特尔® 奔腾® 4 处理器上,例程的活动高速缓存时钟周期数。 例程的加速因子与执行相同计算的 C/C++ 参考实施相比较。 然而,C/C++ 源代码编译后,在基于 x86 FPU 的常规堆栈上运行。

例程加速 因子指令 每个叠代元素 每个叠代数量 叠代总计 指令总计 时钟周期时钟周期 每个元素时钟周期 每个指令
SlerpJoints7.92134256545491315171282.4 (2.411)
LerpJoints4.813242563381952848521.6 (1.563)
ConvertJointQuatsToJointMats1.834110243482334362341.0 (0.987)
ConvertJointMatsToJointQuats2.420742565300373710721.4 (1.391)
TransformSkeleton3.045110244609354297531.2 (1.178)
UntransformSkeleton2.848110244916457285561.2 (1.165)
TransformJoints3.041110244199548906481.2 (1.165)
TransformVerts3.039110243994643956431.1 (1.100)
TransformVerts (SSE3)3.133110243380241963411.2 (1.241)
TransformVertsAndTangents2.680110248193089775881.1 (1.096)
TransformVertsAndTangents (SSE3)2.861110246247481855801.3 (1.310)
DeriveTrianglePlanes4.212142563099036128351.2 (1.165)
CountFacing59.231 + 4256 + 165 + 41963830.32.0 (1.954)
CountFacingCull2.13743361245413883101.1 (1.115)
CreateSilTriangles1.27045043530036901181.0 (1.045)
CreateCapTriangles2.45443361817014205110.8 (0.782)

列出的所有例程都假定要处理的数据位在高速缓存中。 还可选择向例程中添加预取指令。 然而,预取间隔不仅取决于 CPU 类型,还取决于 CPU 速度、内存速度、高速缓存速度、高速缓存级数,以及大量其它因素。 因此,没有预取间隔能适用于所有的系统配置。 英特尔手册提供了一系列标准,可采用预取指令为具体配置优化内存访问。 通常,可通过每次将一个模型下推管线,来提升高速缓存利用率。 同样,管线内每个步骤所获得的结果都会在管线处理下一步骤时从高速缓存中取出,并通过高速缓存迅速写入内存。

同早先采用 130 纳米制程技术的英特尔® 奔腾® 4 处理器比,当代码在较新的、采用 90 纳米制程技术的英特尔® 奔腾® 4 处理器上执行时,文中显示的一些活动高速缓存时钟周期数要略高一些。 首先,这些 CPU 之间活动高速缓存时钟周期数的差异对代表优化的性能增益没有任何影响。 采用 90 纳米制程技术的英特尔® 奔腾® 4 处理器具有更深的管线,因此活动高速缓存时钟周期数会略微偏高。 然而,采用 90 纳米制程技术的英特尔® 奔腾® 4 处理器扩充至更高频率,由于使用了更长的管线,所以由该架构造成的频率增加要超过活动高速缓存时钟周期数的增加。 实际上,采用 90 纳米制程技术的英特尔® 奔腾® 4 处理器具有大量改进,在很多情况下,同运行于相同频率、采用 130 纳米制程技术的英特尔® 奔腾® 4 处理器相比,其性能更加卓越。 同采用 130 纳米制程技术的英特尔® 奔腾® 4 处理器相比,采用 90 纳米制程技术的英特尔® 奔腾® 4 处理器的改进如下:

  • 更大的高速缓存。
  • 改进的软件及硬件预取。
  • 更好的静态及动态分支预测。
  • 增加调度队列,用于进一步实现并行性。
  • 识别出更多可能破坏依赖链(dependency chain)的指令。
  • 降低了某些指令(如整数相乘及按位元逻辑移动等)的延迟。
  • 增加了新的指令,如利用切截将浮点数转换为整数、线程同步指令以及 SIMD 流指令扩展指令集 3(SSE3)。

采用 130 纳米制程技术的英特尔® 奔腾® 4 处理器从 1.6 GHz 扩充至 3.4 GHz, 并提供 512 kB 模上高速缓存。 采用 90 纳米制程技术的英特尔® 奔腾® 4 处理器从 2.4 GHz 扩充至 3.8 GHz,并提供 1 或 2 MB 模上高速缓存。

下列文章阐述了在渲染管线中使用的单个例程,以及如何使用英特尔 SIMD 流指令扩展指令集来对它们进行优化。



上一部分上一部分2  3  4  5  下一部分

第 1 页, 共 6 页