Direct3D 11效果文件被弃用了吗?

19

最近我一直在玩弄Direct3D 11,但由于API基础文档的缺乏(例如简单几何渲染),我感到有些沮丧。其中一个让人困惑的问题是,似乎不再使用效果文件来实现着色器。

在D3D11中,所有效果(.fx)支持都从D3DX库中删除,并被埋藏在一个难以找到的(当然是缺乏文档的)共享源代码库中。包含的示例都未使用它,而是直接编译HLSL文件。所有这一切都表明,微软正在试图让人们停止使用 .fx 文件格式。这是真的吗?是否有任何说明文件说明呢?我可以使用任何方式,但多年来他们一直在推广 .fx 格式,所以他们突然决定放弃似乎有些奇怪。


我非常赞同。ID3DX11Effect在示例中根本没有被引用(除了提供ID3DX11Effect的示例),即使是那个示例也只是构建了一个.lib文件。因为很难使用,所以似乎会让人们望而却步。 - bobobobo
5个回答

6
许多专业的游戏和图形开发者并不使用Direct3D中的特效接口,而且许多领先的游戏引擎也不使用它们。相反,他们会在底层着色器和图形状态管理设施的基础上构建自定义材质/特效子系统。这样做可以让开发者通过共同的资产管理流程来同时针对Direct3D和OpenGL等多种平台进行开发。

1
在我看来,这与此处的主题无关。 - thewhiteambit

5
主要问题是fx_5_0配置文件已经被HLSL编译器团队弃用,这个配置文件需要在编译Effects 11着色器时使用必需的元数据。运行时 shared-source 是可以共享的,但编译器不是。在最新的D3DCompiler (#47) 中会发出有关此问题的警告。fx_5_0从未更新过DirectX 11.1和11.2中的某些新语言方面,但对于Direct3D 11,它可以“按原样”使用。
第二个问题是您需要在运行时使用D3DCompile API才能使用Effects 11。由于D3DCompile仅适用于Windows 8.0和Windows phone 8.0的Windows Store应用程序的“开发”状态,因此在那里不是一个选项。技术上讲,今天可以使用Windows 8.1和Windows phone 8.1的Windows Store应用程序来使用Effects 11,因为D3DCompile #47是操作系统的一部分,并包括对fx_5_0的“废弃/按原样”的编译器支持,但不鼓励这种使用。
大部分的DirectX SDK示例和所有的Windows Store示例都避免使用Effects 11。我发布了一些使用它的Win32桌面示例,可以在GitHub上找到。
更新:随着原始D3DX #43的遗留Microsoft.DXSDK.D3DX NuGet重新打包的发布,我能够更新其余的遗留DirectX SDK示例,使它们能够使用现代的Windows SDK构建,并且不需要安装遗留的DirectX SDK。大部分的Direct3D 9和Direct3D 10示例以及一些Direct3D 11示例都使用遗留的Effects。请参见GitHub
简而言之,是的,你被劝阻使用它,但如果你能接受免责声明,目前仍然可以使用它。

那么你使用什么代替 fx_5_0 - MoonKnight
你根本不使用 Effects。你直接构建所有的排列组合和着色器阶段,如“vs_5_0”,“ps_5_0”等。 - Chuck Walbourn

4
我处于完全相同的位置,在Google上搜索了许多使用D3DX11CreateEffectFromMemory的最简单示例,但我得出的结论是.fx文件支持并不是他们的最高优先级。虽然如果他们不想我们使用它,那么添加EffectGroup概念(这是11中的新功能)就很奇怪。
我已经尝试过新的反射API,所以看起来很容易通过自己的函数来设置变量等,从本质上创建自己的Effect类,下一步将是查看通过API创建渲染状态块的支持情况。能够直接在.fx文件中编辑它们非常好,因此希望仍然存在类似的东西(或者在最坏的情况下,我可以从Effect11代码中提取该部分)。

最终我选择了一个助手类,它使用反射API来解析vs/ps参数,并具有像set_variable(name,value)这样的方法以设置值(如果需要,它们实际上会映射cbuffer并直接更新内存)。我还实现了一个系统,在磁盘上的文件发生更改时,我会得到一个回调,以便可以动态重新加载着色器。对于深度/模板状态等,我最终使用了这些辅助函数:http://legalizeadulthood.wordpress.com/2009/07/12/description-helpers-for-direct3d-10-10-1-and-11/ - Magnus Österlind

1

在DirectX SDK中提供了一个示例效果运行时,可以帮助您使用.fx文件。 请查看目录:%DXSDK_DIR%\Samples\C++\Effects11


1
最新的Effects 11托管在CodePlex上。 - Chuck Walbourn

0

不好意思,CompileFromFile只适用于着色器,因为它需要将函数名作为pFunctionName参数传递,并且效果没有以同样的方式拥有函数。着色器和效果之间的区别在于,效果可以被视为一个容器,它包含渲染状态设置(和其他元数据)以及多个着色器,而着色器只是单个顶点或像素着色器。 - Magnus Österlind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接