1

目前,我正在为 Windows 8 商店、Windows 8 桌面和 Windows 7 开发应用程序。该应用程序应该在平板电脑和“普通”Windows 7/8 设备上顺利运行。所以,我从工作中得到了一台平板电脑并在上面安装了 Windows 8,只是为了意识到令人毛骨悚然的英特尔图形媒体加速器 (600) 只支持 DirectX 9.0c。

所以,我现在尝试了几个小时让我的 DirectX10/11 效果/着色器在 DirectX9 上运行,但似乎没有任何效果。使用 NVidia 的 FxComposer 进行的测试显示,DirectX9 效果运行良好。

我正在使用 SharpDX / C# 进行编程,并且技术 10 和技术 11 都是有效的(MyTechnique.IsValid == true)。要加载效果,我使用这些代码行:

var EffectByteCode  = ShaderBytecode.CompileFromFile("DirectX/Shaders/"+FxFile, "fx_5_0", ShaderFlags.None, EffectFlags.None);
var Effect      = new Effect(GraphicsProvider.Device, EffectByteCode, EffectFlags.None);
mEffect             = FxEffect;
mTechnique11            = mEffect.GetTechniqueByName("main_11"); //works
mTechnique10            = mEffect.GetTechniqueByName("main_10"); //works
mTechnique9             = mEffect.GetTechniqueByName("main_9"); //doesn't work

我在这里粘贴了效果源代码:http: //pastebin.com/KPxBN1DD ..排除了“main_11”和“main_10”,在我的测试中,我将它们注释掉了,所以我只是删除了那些评论块..我认为dx9应该理解这个非常简单的代码..

所以我的最后一个问题是: - 参数“fx_5_0”对于加载技术、技术 10 和技术 11 是否有效?- 我的着色器代码正确吗?还是我做错了什么?- 我是否必须指定任何其他/附加信息/功能/参数来加载 DX9 技术?- 也许它是SharpDX的一个错误?我现在想看看这个代码..

编辑:试图使问题更清楚一点..

4

2 回答 2

3

Windows 8 Metro 不支持旧版效果框架(因为不支持 D3DCompiler_xx.dll),因此您最好使用其他解决方案。此外,Effect 已被 Microsoft 弃用,不再受支持。

旧的 Direct3D9 技术(使用 vs_2_0 或 ps_2_0 编译)不存储在使用 fx_5_0 编译的 FX 文件中(只需检查 fxc.exe 编译器的输出,您不会看到它们)。

您必须使用 vs_4_0_level_9_x 或 ps_4_0_level_9_x 才能使用技术 10/11 语法编译它们以获得 9.x 下级硬件支持。此外,如果您的所有原始着色器都可以与 vs_4_0_level_9_x 一起使用,并且您没有针对 10.0 或 11.1 的任何特定优化版本,那么您不必编译 main_10 或 main_11,因为 level_9_x 着色器正在从 9 开始的任何硬件上工作。 x 到 11.x。

您可能可以看看 SharpDX.Toolkit,它还不是官方的,但它支持一个效果框架(带有一些 XNA 库存效果,如 BasicEffect 或 SpriteBatch)。该工具包的测试版将于本月晚些时候推出。

于 2012-10-16T00:01:10.970 回答
1

尝试用 COLOR0 替换 SV_TARGET 语义。到目前为止,我从未在 D3D9 着色器中看到 SV_TARGET 语义。

于 2012-10-15T18:04:40.100 回答