繁体   English   中英

DirectX 11效果

[英]DirectX 11 Effects

我正在尝试学习DirectX 11,并且正在使用Visual Studio 2013 for Windows 7编写一个小应用程序。我正在阅读“使用DirectX 11进行3D游戏编程简介”一书,到目前为止一切都还不错。 我刚刚介绍了本书的部分内容,其中显示了BoxApp示例,我正在尝试在我的应用程序中实现类似的代码,以便更好地了解最新情况。

我遇到了示例代码中使用的以下不推荐使用的库函数的问题:

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

首先,只是为了看看我是否理解为什么这些不再可用,我对这些函数不再存在的理解是,对于Windows 8,不推荐使用D3DX头文件和库。最初它们是DirectX SDK中提供的辅助库。 Dx9,然后由Os提供Dx10,然后弃用Dx11.1(2)?

现在我的主要问题是如何在没有弃用的D3DX标题的情况下编译着色器和效果? 我对这个问题的正确方法感到有些困惑。

对我来说似乎有两种选择:

  1. 下载帮助库Effects11,它们将提供类似的先前功能。
  2. 使用D3DCompiler库并手动编译效果。

就像我说的那样,我不太确定哪种选择最好(或者即使有更好的替代选择)。 我的理解是Effects11更多地用于支持需要移植到Dx11的旧版Dx10。 由于我没有任何Dx10代码移植,我对这种支持并不太感兴趣,我对Windows 8中的Metro应用程序支持并不太感兴趣(我认为这对他们来说是正确的术语?)或者如果D3DCompiler路径将意味着支持地铁应用程序,然后我想这是可取的。

无论如何,任何建议或见解将不胜感激。 提前致谢。

好吧,它可能有助于了解Direct3DX实用程序库(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 SDK上一版本中的D3DX DLL(2010年6月)
  • 使用开源Effect11库
  • 编写自己的代码
  • 使用某种第三方中间件

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

另一个选择是使用已经建立的游戏引擎,如虚幻或Unity,但我假设你已经打折了这种可能性。

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

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

(1)不建议使用“Effects 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是否已被弃用?

如何避免使用fx_5_0?

“Effects 11”运行时作为一般学习HLSL的工具仍然非常有用,我用它来发布一些旧的DirectX SDK 示例和教育价值的教程

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM