每台计算机都有专门处理图形的硬件,它们控制着屏幕上显示的内容。OpenGL向这种硬件发出命令,告诉它们执行什么操作。计算机游戏或者其他任意软件借助制造商提供的设备驱动程序,使用OpenGL向图形硬件发出命令,如图2-1所示。
![]() |
图2-1 OpenGL的典型应用 |
OpenGL(Open Graphics Library,开放图形库)是游戏开发商使用最早、最流行的图形库之一。OpenGL是Silicon Graphics公司(SGI)在1992年开发的,但是直到1997的GLQuake中采用了这种图形库以后,游戏开发商才真正对它产生了兴趣。 GameCube、Wii、PlayStation 3和iPhone都把OpenGL作为它们的图形库的基础。
除了OpenGL之外,还有一个选择是Microsoft的DirectX。DirectX由更多的库组成,包括声音和输入,所以把OpenGL与 DirectX中的Direct3D库进行比较更加合适。DirectX的最新版本是DirectX 11。Xbox 360使用的是DirectX 9.0。DirectX 10和DirectX 11只能在安装了Windows Vista或Windows 7操作系统的计算机上使用。
Direct3D和OpenGL的功能集基本相同。现在游戏引擎(例如Unreal)通常构建一个抽象层,允许用户根据情况在OpenGL和 Direct3D之间切换,如图2-2所示。当开发跨平台的游戏,例如需要把游戏发布到PlayStation 3和Xbox 360上时,必须提供这种抽象。Xbox 360必须使用Direct3D调用,而PS3必须使用OpenGL调用。
![]() |
图2-2 使用抽象层 |
DirectX和OpenGL都是非常优秀的图形库。DirectX工作在Microsoft平台上,而OpenGL可以应用到更加广泛的平台上。 DirectX更新得更快,意味着它可以利用最新的图形功能。OpenGL的更新较慢,最新的图形功能只能通过一个不太方便的扩展机制使用。OpenGL 这种缓慢的更新有一个明显的好处,即接口很少发生改变,所以多年前编写的代码仍然可以使用最新的OpenGL版本。DirectX的每个新版本都会改变接 口,所以无法维持兼容性,必须调整和修改较老的代码才能使它们利用DirectX的新版本。
通过Managed DirectX库,可以在C#中使用DirectX,但遗憾的是,官方不再支持或更新这些库。Managed DirectX已经被Microsoft的XNA游戏创建库替代。XNA使用DirectX,但它是一个更高层的框架,用于快速创建游戏原型和开发游戏。 SlimDX是一个针对DirectX开发的独立的C# API,可以作为Managed Directx的一个不错的替代品。
2.1 OpenGL的架构
OpenGL是一个C风格的图形库。C风格是指OpenGL中没有类或对象,而只有大量的函数。OpenGL在内部就是一个状态机。函数调用会修改 OpenGL的内部状态,这又会影响OpenGL的行为和在屏幕上渲染多边形的方式。OpenGL是状态机这个事实会带来一些问题,例如在代码中无意间修 改了其他某个部分的状态,从而导致出现bug。因此,留意哪些状态发生改变十分重要。