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

C# Windows 7/8、Direct3D9、10和11-效果/着色器,c#,windows-8,directx,directx-9,directx-10,C#,Windows 8,Directx,Directx 9,Directx 10,目前,我正在为Windows 8应用商店、Windows 8桌面和Windows 7开发一个应用程序。该应用程序应能在平板电脑和“普通”Windows7/8设备上平稳运行。因此,我从工作中得到了一台平板电脑,并在其上安装了Windows8,只是为了意识到,令人毛骨悚然的Intel Graphics Media Accelerator(600)只支持DirectX 9.0c 因此,我花了几个小时试图让我的DirectX10/11特效/着色器在DirectX9上工作,但似乎没有任何效果。。使用NVi

目前,我正在为Windows 8应用商店、Windows 8桌面和Windows 7开发一个应用程序。该应用程序应能在平板电脑和“普通”Windows7/8设备上平稳运行。因此,我从工作中得到了一台平板电脑,并在其上安装了Windows8,只是为了意识到,令人毛骨悚然的Intel Graphics Media Accelerator(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
我在这里粘贴了效果源代码:。。排除了“main_11”和“main_10”,在我的测试中,我注释掉了它们,所以我只是删除了那些注释块。。我认为dx9应该理解这个非常简单的代码

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


编辑:试图使问题更清楚一些。

尝试用COLOR0替换SV_目标语义。到目前为止,我还没有在D3D9着色器中看到SV_目标语义。

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

Windows 8 Metro不支持传统效果框架(因为不支持D3DCompiler_xx.dll),因此您最好使用其他解决方案。此外,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,以便使用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股票效果,如BasicFect或SpriteBatch)。该工具包的测试版将于本月晚些时候发布。

Windows 8 Metro不支持旧版效果框架(因为不支持D3DCompiler_xx.dll),因此您最好使用其他解决方案。此外,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,以便使用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股票效果,如BasicFect或SpriteBatch)。该工具包的测试版将于本月晚些时候发布。

要想提出一个好问题,你需要将注意力集中到一个特定的项目上。您的问题是:如何在特定情况下使Dx9效果工作?如果是这样的话,那么就把你的文章集中在这个问题上。你确定DirectX 9.0c的技术名称是“main_9”为什么你甚至需要这个技术,如果不是10或11,那么就用它的9来表示。@mydogisbox:这更像是一个一般的dx9效果问题-问题是,为什么这个技术没有显示为“IsValid=true”。我给了你我正在做的事情的源代码,并指出,用于dx10和dx11的技术显示为“IsValid=true”,FxComposer也可以执行和编译代码-所以我必须做任何真正错误的事情,但不知道为什么。@Ramhound:是的,我是舒尔,因为GetTechniqueByName尝试加载一种称为“main_9”的技术,在我的代码中,我定义了“main_9”。而且,是的,我可以简单地把它命名为“main”,但我认为这个名字其实并不重要。。我喜欢定义一种“回退”技术,它没有几何体着色器和其他东西,以支持只有Dx9(或一半Dx10支持,如我平板电脑上的Intel GMA 600)的系统。。我希望,我没有看错你的答案。要问一个好问题,你需要把注意力集中到一个特定的项目上。您的问题是:如何在特定情况下使Dx9效果工作?如果是这样的话,那么就把你的文章集中在这个问题上。你确定DirectX 9.0c的技术名称是“main_9”为什么你甚至需要这个技术,如果不是10或11,那么就用它的9来表示。@mydogisbox:这更像是一个一般的dx9效果问题-问题是,为什么这个技术没有显示为“IsValid=true”。我给了你我正在做的事情的源代码,并指出,用于dx10和dx11的技术显示为“IsValid=true”,FxComposer也可以执行和编译代码-所以我必须做任何真正错误的事情,但不知道为什么。@Ramhound:是的,我是舒尔,因为GetTechniqueByName尝试加载一种称为“main_9”的技术,在我的代码中,我定义了“main_9”。而且,是的,我可以简单地把它命名为“main”,但我认为这个名字其实并不重要。。我喜欢定义一种“回退”技术,它没有几何着色器