将 DirectX 移植到 OpenGL ES (iPhone)

Posted

技术标签:

【中文标题】将 DirectX 移植到 OpenGL ES (iPhone)【英文标题】:Porting DirectX to OpenGL ES (iPhone) 【发布时间】:2010-11-12 17:45:32 【问题描述】:

我被要求调查将 10 年前的 Direct X (v7-9) 游戏移植到 OpenGL ES,最初用于 iPhone

我以前从未进行过这样的游戏移植(并将聘请某人来做),但我想了解这个过程。

    是否有任何资源/书籍/博客可以帮助我理解该过程? 有没有像Mono 这样的项目可以做到这一点?

【问题讨论】:

这些 PC 游戏是否是您想要移植到移动设备上的台式电脑游戏?图形的强度如何,我假设它们是 3D,预期的刷新率是 30 fps?您是否在利用 DirectX9 提供的功能? 是的,它们是 3D 桌面游戏,但没有什么特别之处,它们都是 10 岁的,而且非常简单。 【参考方案1】:

TBH 涉及到这样的移植工作,但相当容易。

首先,您首先将所有 DirectX 调用替换为“存根”(即空函数)。你这样做,直到你可以编译软件。编译完成后,您就开始实现所有存根函数。一路上会有很多陷阱,但值得一试。

如果您需要在 iPhone 3GS 之前移植和支持手机,您的任务会更复杂,因为硬件只支持 GLES 1,它只是固定功能。您将不得不以某种方式“模拟”这些着色器。过去,在移动平台上,我编写了直接在顶点数据上执行“顶点着色”的汇编代码。像素着色通常更复杂,但您通常可以通过“顶点着色”提供足够的信息来实现这一点。您可能不得不放弃一些图形功能。

更高版本的 iPhone 使用 GLES 2,因此您可以访问 GLSL ... ATI 编写了,Unity3D 的 Aras P 已经扩展了将移植 HLSL code to GLSL 的软件。

完成所有这些后,您就进入了优化阶段。你可能会发现你的第一遍不是很有效。这是完全正常的。此时,您可以从更高级别查看代码,并了解如何移动代码并以不同方式执行操作以获得最佳性能。

总而言之:您的第一步是让代码在不使用 DirectX 的情况下进行编译。下一步是将 DirectX 调用实际移植到 OpenGL ES 调用。最后,您需要重构剩余的代码以获得最佳性能。

(P.S:我很乐意为您完成移植工作。通过我个人资料中的linkedin页面与我联系;))。

【讨论】:

【参考方案2】:

不是一个完整的答案,但希望能有所帮助......

我不知道有什么专门针对 OpenGL ES,但 Cadega、Cider 和 VirtualBox - 以及其他 - 提供 DirectX 调用到 OpenGL 调用的转换,而 OpenGL ES 从广义上讲是具有很多很少使用的 OpenGL位和一些较慢和多余的部分被删除。因此,至少研究这些产品可能是值得的;至少 VirtualBox 是开源的。

iPhone 3GS 及以后的 SGX 部分具有完全可编程的管道,使其等效于 DirectX 10 部分,因此硬件就在那里。较旧的 MBX 是带有 dot3 扩展的固定管道,但没有立方体贴图,只有两个纹理单元。它还具有矩阵调色板扩展,因此如果可以接受多个通道,您可以制作出色的动画和非常好的照明。

【讨论】:

以上是关于将 DirectX 移植到 OpenGL ES (iPhone)的主要内容,如果未能解决你的问题,请参考以下文章

比较DirectX和OpenGL的区别

在 OpenGL ES Android 中使用 glBufferSubData 和 glMultiDrawArrays

iOS OpenGL ES 与 Android OpenGL ES 兼容吗?

OpenGL ES着色语言-光照效果之散射光

OpenGL vs OpenGL ES 2.0 - 可以轻松移植 OpenGL 应用程序吗?

当阴影相机移动时,Opengl es 2.0阴影会闪烁