3D API

       目前主要有两套3D API:Direct3D和OpenGL。我不想卷入哪个更加优秀的争论。他们都针对相同的底层硬件提供了接口,区别在于接口的质量和简单程度以及他们的实现(驱动),而不是功能特性。
  微软的Direct3D提供了一套相当好的接口(第九版和第十版),但是深受函数调用问题模型之害:绘制函数需要强制内核上下文切换,这是一个相当大的性能开销。另外一个缺陷是它提供的API在版本之间变换,这不是很好的主意,因为这意味着为了在已有的引擎中利用一个新版本的Direct3D,需要重写很多代码。Direct3D在Windows和Xbox 360上可用。
  另一套接口函数是OpenGL,它是采用的客户服务器的模型来实现的,因此不会进行频繁的内核上下文切换。OpenGL针对不同平台OpenGL存在多个版本,例如ES(Embedded Systems)版本,和针对工作站的标准版OpenGL。OpenGL先前是由Architecture Review Board[ARB]领导的,而目前是由Khronos Group领导。
  在OpenGL3.0之前,为了增加新的功能特性而不破坏已有的API接口,都是以扩展的形式加入到OpenGL当中的,由于各个厂商缺乏一致的讨论,造成了一个功能可以有多个函数来完成,使得OpenGL的实现变得较为困难,同时也使得引擎的编写者的任务艰难,因为需要找到那些随时间演变的新扩展。从OpenGL3.0之后,这些问题不复存在了,它遵循的是“至精至简”的原则,废弃了很多函数而形成一套标准。OpenGL在Mac OS X、Windows、Linux等平台上可用。
  在引擎中使用哪套API是一个选择问题,这个决定可以让我们充分利用某套API的功能特性,同时也意味着将我们的引擎限制在某些系统上运行,同时限制了引擎的潜在使用者。
  另一个有趣的方式是不用它们中的任何一个,然后写出一个抽象层在一个模块中隐藏那些API相关的代码,这样子可以使得我们的引擎与API无关。有了这样一个层,引擎将会针对给定的系统选择最优的API来达到最高效。
  基于各种原因,使用该引擎的人想要在多种'Renderer'之间切换。为了达到此目的,将'Renderer'做成插件的形式是一个好主意,在Windows里面是一个DLL(Dynamic Linked Library),在UNIX中则是一个so(shared object)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值