DirectX 11 Effects

DirectX 11 Effects

本文关键字:Effects DirectX      更新时间:2023-10-16

我正在尝试学习DirectX 11,并使用Visual Studio 2013 for Windows 7编写一个小应用程序。我是按照书"介绍3D游戏编程与DirectX 11",到目前为止一切都很好。我刚刚读到书中展示BoxApp示例的部分,我正在通过代码尝试在我的应用程序中实现类似的东西,只是为了更好地理解发生了什么。

我遇到了一个问题,在示例代码中使用以下已弃用的库函数:

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

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

现在我的主要问题是我如何去编译着色器和效果没有弃用的D3DX头?我只是有点困惑,不知道该怎么做。

对我来说,似乎有两个选择:

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

就像我说的,我不太确定哪个是最好的选择(或者即使有更好的选择)。我的理解是,引入Effects11更多的是为了支持需要移植到Dx11的旧Dx10。由于我没有任何Dx10代码移植,我不太担心这种支持,我不太担心Metro应用程序在Windows 8中的支持(我认为这对他们来说是正确的术语?),但如果D3DCompiler路径也意味着支持Metro应用程序,那么我想这是可取的。

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

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

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

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

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

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

最终微软决定停止发布DirectX SDK的新版本,并使其成为Windows SDK的一部分。除了D3DX之外的所有东西,所以在微软看来,D3DX基本上已经死了。不维护,不改进,不更换。

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

基本上你有四个选项:

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

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

另一个选择是使用已经存在的游戏引擎,如Unreal或Unity,但我假设你已经忽略了这种可能性。

最新版本的"Effects 11"运行时是在CodePlex上。

在这一点上,使用Effects 11有两个主要问题:

(1)构建着色器(或真正的着色器加元数据)所需的fx_5_0 HLSL配置文件已弃用"Effects 11"。它目前在最新的公共D3DCompiler(#47)中"原样"工作,尽管在其他5_0配置文件中工作的一些较新的"DirectX 11.1"answers"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 Store应用,D3DCompile #47可用于商店部署的应用。这意味着理论上你可以使用"Effects 11"来实现这个目的,但不建议这样做。

"Effects 11"CodePlex讨论区实际上解决了你的一些问题:

Effects 11已弃用?

如何避免使用fx_5_0?

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

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

对于只想用Direct3D 11编码的初学者,您可以使用DirectX工具包的基本效果,它有一堆"股票"着色器,并处理所有常量和其他问题,而无需使用"效果11"。如果你想玩一些你可以在这里做的事情,你也可以尝试使用Visual Studio Shader Designer (DGSL)系统(也由DirectX Tool Kit支持),尽管这真的是一个更"玩具"的解决方案,但可能是有用的。在任何情况下,您都可以在这些经验的基础上学习编写自己的"效果"系统。