小谈CAD制图和游戏3D的区别

并不是所有人学3D都是为了做游戏,但如今3D学习资料大多是游戏背景的情况下,会让不少走CAD路线的人走错路。

游戏领域,3D向着实时电影级效果发展,强调视觉效果,为了获得足够的运行时性能,要把尽可能多的计算放到制作阶段预处理。而CAD领域,画线能力远比视觉效果重要,模型往往需要实时编辑,对单纯的三角面的吞吐量需求很高,需要在大量的线和面中作精准的选取操作,而对硬件加速需求上,OpenGL 1.2的功能基本就够了。

这些年GPU技术的飞速发展,主要是为了游戏。但这些改进,大多对CAD影响很小。这也是OpenGL ARB委员会的传统CAD厂商对改进OpenGL并不热衷的原因。与游戏代码若干年就重写一次不同,CAD的程序可不希望经常重写,他们需要一个稳定的API,最好50年都不变,但是新的硬件需要提供更好的性能。这些软件大多推荐用户使用专业级显卡,而专业级显卡的一个特点就是图元吞吐量都非常大。

当然,CAD有时也需要效果迷人的成品图,但这一般都是使用高级离线渲染,多花点时间,做成远胜实时渲染的效果。软件离线渲染器似乎可以算是另一个领域。对于工业3D而言,一般会选用一个现成的离线渲染器,而不是自己花时间写一个。

不过,随着GPU通用计算的兴起,也为CAD领域带来了一些新的可能性。大量的计算,尤其是曲面三角化等,有可能交由GPU来处理。不过,这应该不会导致架构上的变化,而只是一些底层API实现上的优化,因为OpenGL本来就是一个良好的工业3D的绘图抽象层。

但这和游戏领域的需求是矛盾的。OpenGL ARB在争论中曾经提出分成两个profile,一个CAD profile,一个game profile。但这个提议被否决了,因为人们不希望出现两个OpenGL。争论在持续了若干年后终于有了进展,新的方案是一个面向新硬件加速架构的core profile和兼容旧程序的compatibility profile。但这对CAD领域来说仍然是很不理想的,因为这意味着compatibility profile的支持会越来越少,他们早晚得重写渲染代码。至于CAD厂商为什么会接受这个提案,从Autodesk公开的的一篇report里能看出一点,他们颇受参差不齐的OpenGL驱动质量之苦。OpenGL是在硬件加速时代之前的产物,功能繁杂,并不是所有功能组合都可以加速,以致很多驱动实现不但bug多多,而且行为不一。这导致测试、补救的代价非常之高,以致3DSMAX 7之后缺省使用D3D做加速后端。如此,则一个新的精简的OpenGL core profile是一个合理的选择。

但是,并不是所有的CAD软件都像3DSMAX这样可以切换渲染后端,有一个渲染抽象层。而且,core profile的API非常的贴近硬件,并不适合直接用来做高层渲染逻辑。总体来说,传统的OpenGL API本身就是一个面向CAD的良好的抽象层,很多年内它仍然会是,构架在OpenGL之上的CAD程序并不十分需要一个新的抽象层。所以OpenGL compatibility profile其实就是用core profile API实现的传统OpenGL API,就是这个抽象层的一个标准实现。如果显卡不提供compatibility profile了,CAD厂商仍然可以自己提供这个实现,又不用重写以前的代码,又可以利用未来新硬件的加速功能。而且,鉴于3D硬件的发展速度,D3D没几年就更新一代,每代之间完全不兼容,贴近硬件的OpenGL core profile也有这种风险。compatibility profile则为CAD软件提供了一层安全垫,只要更换不同的实现就可以了。