Windows 7/8、Direct3D9、10和11-效果/着色器



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

所以,我试了几个小时让我的DirectX10/11特效/着色器在DirectX9上工作,但似乎什么都不起作用。。NVidia的FxComposer测试表明,DirectX9效果运行良好。

我用SharpDX/C#编程,technique10和technique11都是有效的(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"one_answers"main_10",在我的测试中,我注释掉了它们,所以我只是删除了那些注释块。。我认为dx9应该理解这个非常简单的代码。。

所以我最后的问题是:-参数"fx_5_0"是否适用于加载技术、技术10和技术11?-我的着色器代码正确吗?或者我做错了什么?-我是否必须指定任何其他/附加信息/功能/参数来加载DX9技术?-也许是SharpDX的缺陷?我想我现在会看看这个的代码。。

编辑:试图让问题更清楚一点。。

Windows 8 Metro不支持旧版Effect框架(因为不支持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_llevel_9_x,才能使用technique10/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,它还不是官方的,但它支持一个Effect框架(带有一些XNA股票效果,如BasicEffect或SpriteBatch)。该工具包的测试版将于本月晚些时候发布。

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

最新更新