2

I'm trying to learn DirectX 11 and am writing a small application using Visual Studio 2013 for Windows 7. I'm following the book "Introduction to 3D Game Programming with DirectX 11" and so far everything's gone okay. I've just come up to the part of the book where it shows the BoxApp example and I'm just working through the code trying to implement something similar in my app just to get a better understanding of whats going on.

I've come across an issue with the following deprecated library functions used in the example code:

D3DX11CompileFromFile(....);
D3DX11CreateEffectFromMemory(...);

Firstly just to see if I understand why these are no longer available, my understanding as to why these functions no longer exist is that the D3DX header files and libraries have been deprecated for Windows 8. Originally they were helper libraries provided in the DirectX SDK for Dx9, and then provided by the Os for Dx10 before being deprecated for Dx11.1(2)?

Now my main question is how would I go about compiling shaders and effects without the deprecated D3DX headers? I'm just a bit confused about the correct way to go about this.

To me it seems there are two options:

  1. Download the helper libraries Effects11 which'll give similar previous functionality.
  2. Use the D3DCompiler library and compile effects manually.

Like I said I'm not quite sure which the best option would be (or even if there's a better alternative option(s)). My understanding is Effects11 was introduced more for support of older Dx10 that needed to be ported to Dx11. As I've not got any Dx10 code to port I'm not too fussed about that support, I'm not too fussed about Metro app support in Windows 8 (I think thats the right term for them?) either but if the D3DCompiler path would mean support for metro apps as well then I guess that'd be desirable.

Anyway, any advice or insight would be appreciated. Thanks in advance.

4

2 回答 2

9

好吧,回顾一下 Direct3DX 实用程序库 (D3DX) 的历史可能会有所帮助。它最初作为 DirectX 7 SDK 的一部分作为静态库提供,您可以直接链接到应用程序中。它涵盖了许多与现在相同的功能,但值得注意的是它不支持效果,因为直到 Direct3D 8 才引入着色器。

这一切都运作良好,直到有一天微软认为静态库是一个很大的安全漏洞。这可能是因为在 GDI+ 中发现了一些令人讨厌的错误,导致许多使用 GDI+ 的应用程序容易受到与畸形图像相关的攻击。尽管 GDI+ 是作为 DLL 发布的,但每个使用它的应用程序都会在自己的安装目录中安装自己的副本。这意味着微软不能简单地使用 Windows 更新修补 GDI+ DLL,每个使用它的应用程序都必须创建自己的补丁并将其分发给用户。

因此,微软决定向开发人员提供二进制代码以包含在他们的应用程序中是一个错误。Microsoft 提供的任何二进制代码都必须通过 Windows Update 进行更新。这意味着不再有共享库以及对如何重新分发和安装 DLL 的新限制。这就是重新分发 D3DX DLL 时需要使用 DirectX 运行时安装程序的原因。(这也是为什么 Visual Studio 具有涉及清单及其可再发行 DLL 的所有复杂要求的原因。)

但问题在于,它导致微软每次更改 D3DX DLL 时都必须创建新版本的 D3DX DLL,这几乎是每次他们发布新版本的 SDK 时。每个新的 DLL 都不向后兼容旧的 DLL,因此它有了一个新名称。如果您查看您的system32目录,您可能会找到几十个不同的 D3DX DLL。

(显然,D3DX 中只有一个安全漏洞被披露过,CVE-2006-4183。据我所知,这只是在 SDK 的后续版本中修复,没有发布补丁来修复旧版本 D3DX DLL 中的错误。 )

最终,微软决定停止发布 DirectX SDK 的新版本,并使其成为 Windows SDK 的一部分。除了 D3DX 之外的所有东西,所以就微软而言,它几乎已经死了。无需维护,无需改进,无需更换。

然后有一天微软决定从本质上开源 D3DX 库,因为我不知道。所以我们几乎回到了我们开始的地方,应用程序将库直接链接到它们的可执行文件中。除了现在它是开源的,而不是二进制文件,所以任何与安全相关的错误都不是微软的问题。

所以你基本上有四个选择:

  • 使用上一版 DirectX SDK(2010 年 6 月)的 D3DX DLL
  • 使用开源的 Effect11 库
  • 编写自己的代码
  • 使用某种第三方中间件

第一个选项意味着您可能需要将 DirectX redist 与安装程序捆绑在一起。让它在新版本的 Visual Studio 中工作也是一个相当复杂的过程。第二种选择意味着您最终要负责让它发挥作用。第三种选择也是如此,它可能需要做更多的工作。第四个选项可能不存在。所以我认为作为一个新的 Direct3D 程序员,现在最好使用开源库。

另一种选择是使用已经建立的游戏引擎,例如 Unreal 或 Unity,但我假设您已经排除了这种可能性。

于 2014-08-03T16:58:47.237 回答
2

最新版本的“Effects 11”运行时在CodePlex上。

此时使用 Effects 11 有两个主要问题:

(1) 构建使用“效果 11”所需的着色器(或真正的着色器加元数据)所需的 fx_5_0 HLSL 配置文件已弃用。它目前在最新的公共 D3DCompiler (#47) 中“按原样”工作,尽管在其他 5_0 配置文件中工作的一些较新的“DirectX 11.1”和“DirectX 11.2”时代构造无法使用“fx_5_0”进行编译。正式地它已被弃用,预计将在 HLSL 编译器的未来版本中删除。

(2) “Effects 11”要求您在运行时有可用的 D3DCompile API。这是 Windows 8.0 和 Windows Phone 8.0 上的 Windows Store 应用程序的问题,因为您只能使用 D3DCompile 进行开发。对于适用于 Windows 8.1 和 Windows Phone 8.1 的 Windows 应用商店应用,D3DCompile #47 可用于应用商店部署的应用。这意味着理论上您可以为此目的使用“Effects 11”,但不鼓励这样做。

“Effects 11” CodePlex 讨论区实际上解决了您的一些问题:

效果 11 是否已弃用?

如何避免使用 fx_5_0?

“Effects 11”运行时作为学习 HLSL 的工具仍然非常有用,我已经使用它发布了许多旧的 DirectX SDK示例教程,以提供教育价值。

至于你应该投资学习它还是长期使用它,这完全取决于你。

对于只想使用 Direct3D 11 进行编码的初学者,您可以使用DirectX Tool Kit的 BasicEffect ,它具有一堆“库存”着色器,可以处理所有常量和其他问题,而根本无需使用“Effects 11”。如果你想玩一些你可以在这里做的事情,你也可以尝试使用Visual Studio Shader Designer (DGSL) 系统(DirectX Tool Kit 也支持),虽然这实际上更像是一个“玩具”解决方案,但可以有用。在任何情况下,您都可以在这些经验的基础上学习编写自己的“效果”系统。

于 2014-08-09T00:00:27.443 回答