Pixomatic Rendering Technology

Pixomatic 渲染技术

Pixomatic是我们的一个x86 PC版的高级软件光栅引擎。Pixomatic在2005年底被Intel公司收购,但是RAD仍处理授权,支持和更新。 我们有两个版本的Pixomatic可进行授权:Pixomatic 2 和 Pixomatic 3。

Pixomatic 3 特性 - 软件 DX9

Pixomatic 3 是一个DX9等级的软件光栅化引擎,它带有所有该有的功能特性,从完全支持Shader Model 2.0和3.0的Pixel Shading和Vertex Shading 到 各向异性的纹理过滤 到stencil buffers 到 每像素mipmapping,它同时支持32-和64位版本。 转向Pixo 3是一个无痛,由一些简单的优化操作构成,比如减少LOD,小一些的纹理贴图,以此来提高软件渲染的性能。 它比 Microsoft提供的光栅化程序快几百倍。

Pixomatic 3和一个DX9等级显卡之间唯一的区别是速度 - DX9 是完全被支持的。

Pixomatic 2 特性 - 软件 DX7

Pixomatic 2 从特性的角度是直接比得上一个高端DX7等级的图形加速卡的, 它在任何x86兼容的Windows或支持MMX的Linux机器上都能提供高品质的渲染。 它能做two-texture multitexture, Gouraud, specular, fog, alpha testing, alpha blending, 16- and 24-bit z, bilinear filtering, texture transforms, 和 projected textures。它处理 transformation, clipping, 和 projection of trilists, tristrips, trifans, quadlists, polygons, pointsprites, linelists, 以及 linestrips, drawn through begin/end primitives or indexed or non-indexed streams。 它能完成透视校正光栅化(perspective-correct rasterization),具有per-triangle mipmapping, subpixel 和 subtexel accuracy, 以及 32-bit色深。它能清除(clears),填充(fills),复制(copies),拉伸(stretches),反锯齿(antialiases),和抖动(dithers)。 它能提供最接近最新的console和3D卡的速度了。它足够快,可以在一台PIII/733 MHz的电脑商以28fps 运行Quake II, 在P4/2.2 GHz电脑上能达到67 fps,在P4/3.3 GHz地电脑上能达到108 fps!

Pixomatic 2 支持 cubemaps, 可编程 pixel shaders, 每像素 mipmapping, 或 trilinear filtering,因为那些特性不能在软件中很高效被实现。 Pixomatic 同时也不提供lighting和可编程vertex shader的API,因为这些能够更灵活更高效完成 - 通过游戏自身而不是Pixomatic。 (Pixomatic 2 提供一个per-vertex 用户回调(callback)来使游戏更容易实现这两个特性。)

您能够找到一个更完整的列表在 Pixomatic 特性页,但是以上这些应该足够给您一个关于Pixomatic能做什么和不能做什么的印象了。

软件渲染 - 什么?

时下,3D硬件已经非常普遍了,Pixomatic的价值是什么呢? Pixomatic能够以两种主要的途径中的任一种来传递价值。首先是通过提供 可信赖的和一致的技术 给一些需要或者会使用3D的游戏,但是它们又不要求复杂的pixel shaders,大量的三角形,或者巨大的填充率, 并且想要避免因处理PC硬件问题而带来的复杂性和成本。 虽然那或许听起来不很特别,事实上从节省的时间和金钱,资源的释放,以及潜在增加的市场空间角度,好处是显而易见的,就如在 "为什么是Pixomatic? " 详细讨论的一样。 Pixomatic能够增加价值的第二种途径是通过作为一个后备渲染器来服务一些游戏,那些游戏需要好硬件来达到最好的效果,但是为了拓宽他们的市场同时减少技术支持的成本,他们仍然希望能够在每一台电脑上运行而不管他们的硬件加速情况怎么样。

让我们近距离看看Pixomatic是如何工作的,为什么我们那样设计它。

我们从开始就知道 它需要很容易来写游戏 是Pixomatic最优先的任务,或者将游戏移植给它; 因此,Pixomatic的特性集紧密地和在相同性能范围的硬件所能提供的特性进行映射。为了更有效率,Pixomatic使用一套定制的API, 但它被设计为从行业标准进行移植。Pixomatic没有任何含糊不清的东西,也没有放置任何不常用的需求到您的游戏设计中; 没有任何保留,没有BSP树,没有跨度列表(span list),没有边列表(edge list),或其它过去软件光栅化程序所依赖的很多聪明的戏法。 Pixomatic是一个经典3D管道的非常直接的实现:任何各种形式的多边形从一边进来,在z testing和stencil testing之后,栅格化,pixel shader的结果从另边出来并写入帧缓冲区(frame buffer)。 所有的光栅化特性一起工作在几乎任何联合(唯一的例外是在stencil buffer正在被写入时,没有帧缓冲区或z buffer绘图会发生)。 如果您对OpenGL或DX任一个熟悉的话,您学习使用Pixomatic就不会有任何问题了。.

我们第二个必须要达到的是,在软件光栅化的性能局限和使用约束下,能够尽可能的产生最高品质的结果。 通过pipeline为每个颜色构成用一个最小的8位,做透视校正(perspective-correct),subtexel-accurate 纹理映射来实现我们核心的特性集,从而我们做到了。 然后我们添加了所有我们能让它跑得足够快的渲染特性,它仍然使用同样地颜色深度和精度:dot3 per-pixel lighting; antialiasing; stencil shadows; optional 24-bit z; 和 bilinear filtering,加上两个为light map工作得很棒的更快的过滤器。

我们的最终目标,当然是,性能。写一个能够产生高品质输出的软件光栅化程序并不是那么难,难的部分是写一个运行很快的。 我们从一开始就知道性能将会是我们Pixomatic最大的挑战,因此我们为PIII- 和P4级别的电脑上可能最好的性能努力,从这里我们设计了Pixomatic 2, 使用每个我们能够想到的并且不会降低渲染品质的优化技术。对于Pixomatic 3,我们最高的优先级是建立一个DX9适用的渲染器,但是性能是一个略居其次的问题。 在Pixomatic 3里关键的新的性能要素是支持最多16个核心之间的并行处理。

Pixomatic 2 性能

Pixomatic 2的性能和品质的核心,我们称为“焊接工(welder)”,无论什么时候光栅化状态改变, 软件都会动态编译像素管线,生成相等的代码给手工调优汇编语言。 (事实上,它是手工调优的汇编代码;汇编过程致力于把手工优化后的代码片段聪明的连结和混合在一起。) 被焊接的像素管线(Pixel Pipeline)使用所有8个MMX寄存器和所有8个通用寄存器来在几乎所有时候都保持动态变量在寄存器中( 当高洛德着色(Gouraud), 镜面反射(Specular),和两个纹理都和Bilinear filtering一起被使用的时候,会有一些保存/恢复的情况)。 纹理(Texel)检查自己需要只不过是5条指令,感谢MMX的谨慎使用。 只有一个分支 - 循环分支 - 是每像素被执行的,它和z,Stencil,和Alpha tests分开,如果它们被启用的话。 z或stencil出错时pipeline会提前退出。

上移更高一级,三角形管线,它驱动像素管线,通过为每个三角形生成一个span的列表绘制来工作。 每个span不长于16个像素,有浮点透视校正纹理计算在每一端被执行。 像素管线再依次画每个span,从一端到另一端的线性插值,从为每个像素执行透视分隔来产生不易区别的但是性能好得多的结果。 Span生成器自动使用SSE或3DNow如果任一个是存在的话,SSE版本被完全写入在手工调优后的汇编语言里,具有7个通用寄存器, 8个MMX寄存器,其中的6个MMX寄存器可以同时使用。 当预取(prefetch)是可用得花,指令Z 预取(prefetching)被使用于有效改善内存延迟。

简单而言,光栅化管线被设计来提供最好的性能,我们知道如何榨干一个具有MMX和可选的SSE或3DNow的X86处理器的潜力, 同时仍然保持32-bit,透视校正,subpixel- 及 subtexel-precise 的渲染品质。

几何管线是类似的被构造来达到最高的性能。一个C,手工调优汇编代码加上动态编译代码的组合被用于尽可能高效地处理很多 接口类型(interface types),原始类型(primitive types)和流配置(stream configurations)的组合。 我们甚至开发了一个定制的预处理器,因此我们能够横跨全范围配置来重用调优后的代码。 再次说明一下,如果可用的话,SSE和3DNow将被使用。

多种针对MMX优化的清除(clears)和填充(fills)被提供,和bilts一起到32-, 24-, and 16-bit的目标,后者支持抖动(dithering)。 同样也有汇编代码在一些地方,并且酌情在其它地方进行动态编译。 无论什么时候,只要预取是可用的,它都被用于加速清除(clears)和填充(fills)和blts的操作。

最后,Pixomatic 提供缓冲区管理和屏幕更新函数,并且,如果您喜欢,它能够自动找出更新前端缓冲区的最快的途径,在GDI blts和它自己拥有的针对MMX优化后的blts中选择。

Pixomatic 3 性能

Pixomatic 3 由于要完全支持DX9兼容,它大概比Pixomatic 2慢4倍。 然而,Pixo 3也是设计成支持多CPU的!因具有几乎完美的线性增长,Pixomatic完全受益于多核心和多CPU机器。

Pixomatic 3的核心是一个针对Intel优化后的SSE Shader编译器。 这和在一些Intel硬件GPUs上驱动vertex shading的编译器是同一个;我们已经对它进行了大幅度的优化,增加了Pixel Shading的特性。 您的DX游戏会运行,很惊奇,只是会稍慢一点点!

我们的性能驱动是如何解决的?

我们对结果很满意,我们感觉相当接近在一个具备通用3D API的当前x86 CPUs的电脑上能够达到的最好的性能。 Pixomatic的性能超过了Quake游戏的需要,并且也能满足很多最近热销的游戏。

简单而言,Pixomatic 实现了一个标准的,3D功能核心集合,这个核心集非常适合在一个CPU上实现,而且易于使用,同时在不牺牲渲染品质或易用性的前提下达到了最好的性能。 它没有尝试去做那些在CPU性能局限下无法很好完成的事情,但它所作的,它做得非常有效,精确和可靠。