【问题标题】:DirectX programming in C?C语言中的DirectX编程?
【发布时间】:2019-02-27 18:52:46
【问题描述】:

过去我用 C++ 编程语言创建了 DirectX 应用程序,但是,我想知道是否可以使用 C 编程语言来做到这一点。

谢谢。

【问题讨论】:

  • 仅限 C 的限制是否有原因?

标签: c directx


【解决方案1】:

Open Watcom C/C++ 编译器带有 C++ 和 C 语言的 DirectX 示例应用程序。两者都可以工作。它们在 OW 1.9 中分别位于 WATCOM\samples\directx\cppWATCOM\samples\directx\c 之下。

这是代码在 C++ 中的样子:

hr = d3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps9);
hr = d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, game_window, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &d3d_dev);

在 C 中:

hr = IDirect3D9_GetDeviceCaps(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps9);
hr = IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, game_window, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &d3d_dev);

您不需要对 C 中的 COM 做任何特别的事情,因为似乎已经定义了足够多的宏供您使用。

【讨论】:

  • 人们应该被激励以这种方式回答,从“有可能......”延伸到“这就是它的完成方式......”。我非常感谢您提供的信息,我是初学者,我开始考虑为 C++ 方法创建 C 包装器。谢谢。
  • @Ivanzinho 这可能并不普遍适用或不可取。
  • 为什么不推荐?我正在学习 C,我认为学习它的最好方法是实际使用它。 (顺便说一句,我已经用 C# 编程了 12 年多,我知道 OOP 是什么)
【解决方案2】:

是的,这是可能的。 DirectX 公开了一个 COM 接口,而 C 能够使用它们。但这不会是一整艘船的乐趣!

【讨论】:

  • 我试过了。你已经习惯了,但它仍然不愉快或不容易。
  • 这种方式也是可行的,但正如大卫所说,这根本不好玩。如果您尝试走这条路,祝您好运。
【解决方案3】:

您可以在 C 中使用 DirectX。它具有特定的宏来简化 COM 接口的使用。但是,使用 C++ 要容易得多。

【讨论】:

    【解决方案4】:

    我认为 DirectX 库有一些仅限 C++ 的组件(我已经有一段时间没有使用它了,从上次我记得它包含类)。不妨用 C++ 让您的生活更轻松一些。

    【讨论】:

    • 仅仅因为你可以并不意味着你应该有时。虽然如果他愿意,那么他可以继续前进,呵呵。
    • @Jesus 嘿嘿确实。我最近不得不用 C 实现一个 COM 接口。这确实让我头疼。
    • 我也做过类似的事情,除了我对 .NET 和 C# 中的 COM 组件比 C 更头疼。看到一些 DirectX 的东西通过 COM 有效地工作肯定会很酷.
    • @Jesus Ahh,我正在回忆一些 C++ 位。这可能只是在将错误代码转换为错误消息的例程中吗?
    • @David:我相信。虽然我仍然不确定为什么有人会想在 C 中尝试这个,除非他们以某种方式受虐(如果有人要尝试这个,我不会冒犯,我会发现它比它需要的更困难) .
    【解决方案5】:

    这是可能的,但是由于您缺少 C++ 提供的高级功能,您自己就更难了。

    【讨论】:

    • @Geoffrey 实际上确实如此。许多用于 Windows 的 API 使用从类构建的 C++。要使用它,您需要访问 C 中的类,这可能吗?是的。实用吗?一点也不,在您已经使用类的地方使用 C++ 会容易得多,因此您可以按原样使用 API,而无需变通方法。
    • @Geoffrey 另外,从您的评论中,您说我建议 C 比 C++ 更难(我不知道您在什么情况下这么说)。 C 的学习曲线比 C++ 小很多(比 C++ 更小的库和整体更小的语法)。然而,在 this 的情况下,如果您尝试使用为 C++ 实现的 API,在 C 中使用它们会使您的生活变得更加困难。
    • 这是我目前正在研究的 C 语言示例:github.com/gnif/LookingGlass/blob/master/c-host/windows/capture/…。我真的不明白这有多难,只是有点不同。
    • 非常好。我会感兴趣地看一下谢谢。 @杰弗里
    • 我的经验是,C 只是“看起来”更难,因为没有 RAII(因此没有 com_ptr)。除此之外?差别不大。
    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2012-07-09
    相关资源
    最近更新 更多