我正在尝试学习DirectX 11,并且正在使用Windows 7的Visual Studio 2013编写一个小型应用程序。我正在阅读《使用DirectX 11进行3D游戏编程简介》一书,到目前为止一切正常。我刚读完本书的那一部分,显示了BoxApp示例,我正在研究代码,试图在我的应用程序中实现类似的功能,以便更好地了解正在发生的事情。
我在示例代码中遇到了以下不推荐使用的库函数的问题:
D3DX11CompileFromFile(....);
D3DX11CreateEffectFromMemory(...);
首先,只是为了了解我是否理解为什么这些功能不再可用,我对为什么这些功能不再存在的理解是,Windows 8不推荐使用D3DX头文件和库。最初,它们是DirectX SDK中提供的用于Dx9,然后由Os为Dx10提供,然后才弃用Dx11.1(2)?
现在我的主要问题是,如何在不使用D3DX header 的情况下编译着色器和效果?我对执行此操作的正确方法有些困惑。
在我看来,有两种选择:
就像我说的那样,我不太确定哪个是最佳选择(或者即使有更好的替代选择)。我的理解是,引入了Effects11是为了支持需要移植到Dx11的较旧Dx10。由于我没有要移植的任何Dx10代码,因此我不太在意这种支持,所以我也不太在意Windows 8中的Metro应用程序支持(我认为这是正确的说法?),但是如果使用D3DCompiler路径也将意味着对Metro应用程序的支持,那么我想这是理想的。
无论如何,任何建议或见解将不胜感激。提前致谢。
最佳答案
好吧,回顾一下Direct3DX实用程序库(D3DX)的历史记录可能会有所帮助。它最初作为DirectX 7 SDK的一部分作为静态库提供,您直接链接到应用程序中。它涵盖了许多与现在相同的功能,但是值得注意的是它不支持效果,因为直到Direct3D 8才引入着色器。
在微软决定某天静态库是一个很大的安全漏洞之前,这一切都运行良好。可能是因为在GDI +中发现了一些令人讨厌的错误,使许多使用GDI +的应用程序容易受到与格式错误的图像有关的攻击。即使GDI +是作为DLL交付的,使用它的每个应用程序也会在其自己的安装目录中安装其自己的副本。这意味着微软不能简单地使用Windows更新来修补GDI + DLL,每个使用它的应用程序都必须创建自己的补丁并将其分发给用户。
因此,微软认为将二进制代码发送给开发人员以使其包含在其应用程序中是一个错误。 Microsoft提供的任何二进制代码都必须通过Windows Update进行更新。这意味着不再需要共享库,也没有关于如何重新分发和安装DLL的新限制。这就是为什么在重新分发D3DX DLL时需要使用DirectX运行时安装程序的原因。 (这也是为什么Visual Studio具有涉及 list 及其可重新分发的DLL的所有复杂要求的原因。)
但是,这样做的问题在于,这导致Microsoft每次更改D3DX DLL都必须创建新版本,这几乎是他们每次发布SDK的新版本时都必须创建。每个新的DLL与旧的DLL都不向后兼容,因此有了一个新名称。如果您在system32
目录中查找,则可能会找到几十个不同的D3DX DLL。
(显然,D3DX中仅披露了一个安全漏洞CVE-2006-4183。据我所知,此漏洞仅在后续版本的SDK中得到了修复,没有发布修补程序来修复D3DX DLL的较早版本中的错误。)
最终,Microsoft决定停止发布DirectX SDK的新版本,并使其成为Windows SDK的一部分。除了D3DX之外,其他所有东西都没有,因此就Microsoft而言,它几乎已经死了。没有维护,没有改进,也没有替代。
后来有一天,微软决定从根本上开放D3DX库的源代码,因为我不知道。因此,我们回到了起点,应用程序将库直接链接到其可执行文件中。除了现在它是开源的,不是二进制文件之外,因此任何与安全相关的错误都不是Microsoft的问题。
因此,您基本上有四个选择:
第一个选项意味着您可能需要将DirectX redist与安装程序 bundle 在一起。使它工作于较新版本的Visual Studio也是一个相当复杂的过程。第二种选择意味着您要最终负责使其工作。第三种选择也是如此,并且可能还有更多工作要做。第四个选项可能不存在。因此,我认为,作为当今的Direct3D新程序员,最好使用开源库。
另一种选择是使用已经建立的游戏引擎,例如Unreal或Unity,但我假设您已经忽略了这种可能性。