利用 3D API 并非易事。我仍在为自己努力,尽管 OpenGL 支持仍然大部分缺失,因此 API 具有高度的理论性,至少在我通过 Direct3D 实现达到一个体面的里程碑之前,并在 OpenGL 上找到一些体面的文档,这样我就可以尝试构建 OpenGL 变体,看看我能走多远,以及我的假设有多少实际上符合现实。
那可能是当我看到实现 OpenGL 对现有设计来说只是轻而易举时,或者(更有可能)当我决定放弃 OpenGL(和 MacOS+Linux连同它)完全:-)
我可以这样做,因为它是一个私人宠物项目,无论如何都不会完成。对于任何有可能完成的事情,或者需要完成的事情,我建议不要这样做。这是很多工作。
你必须做的事情至少包括:
- 使你的 API 足够抽象,这样两个渲染 API 之间就没有应用程序可见的差异,同时又不会失去性能(所以不要通过一直转换东西来做事情。在一些抽象数据收集和转换中拥有一百万个顶点很好每次都使用 Direct3D 或 OpenGL 以获得最大的灵活性, 但这只会给你一个幻灯片. 因此, 在我看来, 要走的路是让渲染 API 实际处理更高级别的数据, 例如模型或场景而不是顶点和三角形)
当然,对我来说一个主要问题是,我不仅试图在不损失性能的情况下抽象出 Direct3D 和 OpenGL,而且还试图在此过程中建立 3D-gfx-know-how。这使得想出“最好的”设计变得困难,并且需要大量的回溯。
- 决定如何处理着色器(目前,我决定根本不处理这些,只要求应用程序提供这两种实现)。我目前的主要希望寄托在着色器上——假设一旦我掌握了所有技术细节和 API 特定的东西,2012 年的 3D 图形应该主要是在数据和缓冲区上运行着色器的问题。
当然,我可能全都错了,Direct3D/OpenGL 与使用宏通过 1:1 映射处理的事情实际上是一样的,但我很肯定这不是那么简单。它仍然可以在具有一组固定功能的相同硬件上工作,我什至相信 HLSL 和 GLSL 足够相似,最终可以为两者创建一个统一的语言。
尽管如此,我在这里写这些漫无边际的东西的原因是为了劝阻你。据我所知(猜猜看,你可能从未听说过我的名字——让你自己猜猜这意味着什么)这是一个相当大的挑战。