我正在尝试学习DirectX 11并且正在使用Visual Studio 2013 for Windows 7编写一个小应用程序。我按照本书"使用DirectX 11进行3D游戏编程简介"到目前为止,一切都很顺利。我只是看到了本书中显示BoxApp示例的部分,我正在尝试在我的应用程序中实现类似的代码,以便更好地了解最新情况。
我遇到了示例代码中使用的以下不推荐使用的库函数的问题:
D3DX11CompileFromFile(....);
D3DX11CreateEffectFromMemory(...);
首先,只是为了了解我是否理解为什么这些功能不再可用,我对这些功能不再存在的理解是,对于Windows 8,不推荐使用D3DX头文件和库。最初它们是提供的辅助库。 DirectX SDK for Dx9,然后由Os for Dx10提供,然后弃用Dx11.1(2)?
现在我的主要问题是如何在没有弃用的D3DX标题的情况下编译着色器和效果?我对这个问题的正确方法感到有些困惑。
对我而言似乎有两种选择:
就像我说的那样,我不太确定哪种选择最好(或者即使有更好的替代选择)。我的理解是Effects11更多地用于支持需要移植到Dx11的旧版Dx10。由于我没有得到任何Dx10代码,我对这种支持并不太感兴趣,我对Windows 8中的Metro应用程序支持并不太感兴趣(我认为这对他们来说是正确的术语? )或者,如果D3DCompiler路径意味着支持地铁应用程序,那么我想这是可取的。
无论如何,任何建议或见解都将不胜感激。提前谢谢。
答案 0 :(得分:9)
嗯,回顾一下Direct3DX Utility Library(D3DX)的历史可能会有所帮助。它最初作为DirectX 7 SDK的一部分作为静态库提供,您可以直接链接到您的应用程序中。它涵盖了许多与现在相同的功能,但值得注意的是它没有支持效果,因为在Direct3D 8之前不会引入着色器。
直到有一天微软认为静态库是一个很大的安全漏洞,这一切都运行良好。这可能是因为在GDI +中发现了一些令人讨厌的错误,导致许多使用GDI +的应用程序容易受到与格式错误的图像相关的攻击。即使GDI +作为DLL发布,使用它的每个应用程序都会在自己的安装目录中安装自己的副本。这意味着微软不能简单地使用Windows更新修补GDI + DLL,使用它的每个应用程序都必须创建自己的补丁并将其分发给用户。
因此微软决定向开发人员提供二进制代码以包含他们的应用程序是一个错误。 Microsoft提供的任何二进制代码都必须通过Windows Update进行更新。这意味着不再需要共享库和对如何重新分发和安装DLL的新限制。这就是在重新分发D3DX DLL时您需要使用DirectX运行时安装程序的原因。 (这也是为什么Visual Studio具有涉及带有可再发行DLL的清单的所有复杂要求的原因。)
问题在于,它导致Microsoft每次更改时都必须创建新版本的D3DX DLL,几乎每次他们发布新版本的SDK时。每个新的DLL都没有向后兼容旧的DLL,因此它得到了一个新名称。如果你查看system32
目录,你可能会发现几十个不同的D3DX DLL。
(显然,D3DX中只有一个安全漏洞被公开,CVE-2006-4183。尽管我已经知道这只是在后续版本的SDK中修复了,但是没有发布修补程序来修复旧版本中的错误D3DX DLL。)
最终,微软决定停止发布新版本的DirectX SDK,并将其作为Windows SDK的一部分。除了D3DX之外的所有东西,就微软而言,它几乎已经死了。无需维护,无需改进,无需更换。
然后有一天微软决定基本上开源D3DX库,因为我不知道。所以我们几乎回到了我们开始的地方,应用程序将库直接链接到他们的可执行文件中。除了现在它是开源的,而不是二进制文件,因此任何与安全相关的错误都不是微软的问题。
所以你基本上有四种选择:
第一个选项意味着您可能需要将DirectX redist与安装程序捆绑在一起。让它工作更新版本的Visual Studio也是一个相当复杂的过程。第二种选择意味着您最终有责任让它发挥作用。第三种选择也是如此,它可能还有很多工作要做。第四个选项可能不存在。所以我认为作为一个新的Direct3D程序员,今天可能最好使用开源库。
另一种选择是使用已经建立的游戏引擎,如虚幻或Unity,但我假设你已经打折了这种可能性。
答案 1 :(得分:2)
最新版本的“效果11”运行时位于CodePlex。
此时使用效果11有两个主要问题:
(1)不建议使用“效果11”构建着色器(或实际着色器加元数据)所需的fx_5_0 HLSL配置文件。它目前在最新的公共D3DCompiler(#47)中“按原样”工作,尽管在其他5_0配置文件中工作的一些较新的“DirectX 11.1”和“DirectX 11.2”时代结构无法使用“fx_5_0”进行编译。它正式被弃用,预计将在HLSL编译器的未来版本中删除。
(2)“效果11”要求您在运行时使用D3DCompile API。这是Windows 8.0和Windows Phone 8.0上的Windows应用商店应用的问题,因为您只能使用D3DCompile进行开发。使用适用于Windows 8.1和Windows Phone 8.1的Windows应用商店应用,D3DCompile#47可用于商店部署的应用。这意味着理论上你可以为此目的使用“效果11”,但不鼓励它。
“效果11”CodePlex讨论区实际上解决了您的一些问题:
“效果11”运行时作为一般学习HLSL的工具仍然非常有用,我用它来发布一些旧的DirectX SDK samples和tutorials以获得教育价值
至于你是否应该投资学习或长期使用它,这完全取决于你。
对于只想使用Direct3D 11编码的初学者,你可以使用DirectX Tool Kit的BasicEffect,它有一堆'stock'着色器,处理所有常量和其他问题,而不必使用“效果”总共11“。您还可以尝试使用Visual Studio Shader Designer(DGSL)系统(也支持DirectX工具包),如果您想要玩这里可以做的一些事情,尽管这更像是一个“玩具”解决方案但是可能很有用。无论如何,您可以在这些经验的基础上学习编写自己的“效果”系统。