我有一个非常简单的测试效果文件,我尝试用以下代码加载:
using D3D = Microsoft.WindowsAPICodePack.DirectX.Direct3D10;
...
var DxDevice = CreateDevice(D3D.DriverType.Hardware);
var stream = Application.GetResourceStream(Global.MakePackUri("Resources/Effects/Test.ps"));
var DxEffect = DxDevice.CreateEffectFromCompiledBinary(stream.Stream);
MessageBox.Show(DxEffect.Description.Techniques);
效果中的技术数量总是为零。
效果文件除了为位图上色以方便识别之外什么都不做:
sampler2D input1 : register(S0);
float4 DoHorizontal(float2 uv : TEXCOORD) : COLOR
{
return float4(1, 0, 1, 1);
}
float4 DoVertical(float2 uv : TEXCOORD) : COLOR
{
return float4(1, 1, 0, 1);
}
technique Test
{
pass P0
{
PixelShader = compile ps_4_0 DoHorizontal();
}
pass P1
{
PixelShader = compile ps_4_0 DoVertical();
}
}
编译时没有任何错误(使用fxc /T fx_4_0
)。在Windows API代码包中是否有任何HLSL不兼容可能导致这种奇怪的行为?
你的效果仍然使用旧的DirectX9语法,而你使用Shader Model 4,这可能会产生问题。
更新版本,以适应DX10+语法:
SamplerState input1 : register(S0);
float4 DoHorizontal(float2 uv : TEXCOORD) : SV_Target
{
return float4(1, 0, 1, 1);
}
float4 DoVertical(float2 uv : TEXCOORD) : SV_Target
{
return float4(1, 1, 0, 1);
}
technique10 Test
{
pass P0
{
SetPixelShader( CompileShader( ps_4_0, DoHorizontal() ) );
}
pass P1
{
SetPixelShader( CompileShader( ps_4_0, DoVertical() ) );
}
}
只是试着在SlimDX和SharpDX中加载它,我得到了没有问题的技术,所以如果你仍然没有列举技术,这绝对是Windows API核心包的问题。