对于任何图形程序员,我都有一个愚蠢的问题。
我很困惑某些游戏(如孤岛危机)如何同时支持 DirectX 9(在 XP 中)和 10(在 Vista 中)?
到目前为止我的理解是,如果你写一个 DX10 应用程序,那么它只能在 Vista 中运行。
也许他们有 2 个代码库——一个用 DX9 编写,另一个用 DX10 编写?但这不是矫枉过正吗?
对于任何图形程序员,我都有一个愚蠢的问题。
我很困惑某些游戏(如孤岛危机)如何同时支持 DirectX 9(在 XP 中)和 10(在 Vista 中)?
到目前为止我的理解是,如果你写一个 DX10 应用程序,那么它只能在 Vista 中运行。
也许他们有 2 个代码库——一个用 DX9 编写,另一个用 DX10 编写?但这不是矫枉过正吗?
他们有两个渲染管道,一个使用 DX9 调用,一个使用 DX10 调用。这些 API 不兼容,尽管任何游戏引擎的大部分都可以重用。如果您想要一些关于如何完成不同渲染管道的开源示例,请查看 Ogre3d 之类的东西,它支持 OpenGL、DX9 和(很快)DX10 渲染。
游戏的渲染层通常是整个应用程序中一个相当隔离/抽象的部分。就游戏引擎而言,每一帧都只是建立一个概念对象(树、角色等)的列表。如果游戏引擎选择渲染特定对象,则取决于渲染层如何将该意图实际转换为 DX 绘制调用。DX10 渲染将生成一组不同的对 DX9 图层的绘制调用,但从概念上讲,它们仍在执行相同的操作 - “渲染这棵树”。
渲染被很好地抽象了,因为您很少想从渲染层获取任何信息,一旦执行“渲染这棵树”操作,游戏引擎将假设渲染看起来正确。几乎不需要处理来自 DX9/DX10 渲染调用的不同潜在结果,因为 99.9% 的信息是从引擎传递到图形系统的,而返回的 0.1% 可能在两个 API 之间采用相同的形式。
应用程序设置有点棘手,因为您必须询问系统是否支持 DX10,否则优雅地回退到 DX9,但这是应用程序设置的标准费用(与游戏必须选择分辨率、刷新率、输入设备等)。
他们很可能有一个抽象层,并针对它进行开发。在运行时,它们会实例化 DX9 或 DX10 包裹混凝土引擎。
我想他们的抽象定位非常接近 DirectX 层,并且简单地为 DX9 提供 DX10 功能的合理手动实现,或者在 DX10 上运行时增强 DX9 逻辑。