目前,我正在开发适用于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)。要加载效果,我使用theese代码行:
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的一个错误?我现在想看看这个代码吧......
编辑:试图让问题更加清晰......
答案 0 :(得分:3)
Windows 8 Metro不支持旧版效果框架(因为不支持D3DCompiler_xx.dll),因此您应该更好地使用其他解决方案。此外,Microsoft不推荐使用Effect,也不再支持。
旧的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,以便使用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,但还不是官方的,但它支持一个效果框架(有一些XNA股票效果,如BasicEffect或SpriteBatch)。该工具包的测试版将于本月晚些时候发布。
答案 1 :(得分:1)
尝试用COLOR0替换SV_TARGET语义。到目前为止,我从未在D3D9着色器中看到过SV_TARGET语义。