Не можете скомпилировать тот же шейдер в SlimDX, который работает в XNA?
Я пытаюсь загрузить файл FX в slimdx, у меня есть точная загрузка и компиляция файла FX с XNA 4.0, но я получаю ошибки с slimdx, вот мой код для его загрузки.
using SlimDX.Direct3D11;
using SlimDX.D3DCompiler;
public static Effect LoadFXShader(string path)
{
Effect shader;
using (var bytecode = ShaderBytecode.CompileFromFile(path, null, "fx_2_0", ShaderFlags.None, EffectFlags.None))
shader = new Effect(Devices.GPU.GraphicsDevice, bytecode);
return shader;
}
Вот шейдер:
#define TEXTURE_TILE_SIZE 16
struct VertexToPixel
{
float4 Position : POSITION;
float2 TextureCoords: TEXCOORD1;
};
struct PixelToFrame
{
float4 Color : COLOR0;
};
//------- Constants --------
float4x4 xView;
float4x4 xProjection;
float4x4 xWorld;
float4x4 preViewProjection;
//float random;
//------- Texture Samplers --------
Texture TextureAtlas;
sampler TextureSampler = sampler_state { texture = <TextureAtlas>; magfilter = Point; minfilter = point; mipfilter=linear; AddressU = mirror; AddressV = mirror;};
//------- Technique: Textured --------
VertexToPixel TexturedVS( byte4 inPos : POSITION, float2 inTexCoords: TEXCOORD0)
{
inPos.w = 1;
VertexToPixel Output = (VertexToPixel)0;
float4x4 preViewProjection = mul (xView, xProjection);
float4x4 preWorldViewProjection = mul (xWorld, preViewProjection);
Output.Position = mul(inPos, preWorldViewProjection);
Output.TextureCoords = inTexCoords / TEXTURE_TILE_SIZE;
return Output;
}
PixelToFrame TexturedPS(VertexToPixel PSIn)
{
PixelToFrame Output = (PixelToFrame)0;
Output.Color = tex2D(TextureSampler, PSIn.TextureCoords);
if(Output.Color.a != 1)
clip(-1);
return Output;
}
technique Textured
{
pass Pass0
{
VertexShader = compile vs_2_0 TexturedVS();
PixelShader = compile ps_2_0 TexturedPS();
}
}
Теперь этот точный шейдер прекрасно работает в XNA, но в SlimDX я получаю ошибку
ChunkDefault.fx(28,27): error X3000: unrecognized identifier 'byte4'
1 ответ
Если я правильно помню, byte4 - это что-то из профилей досягаемости /hd в XNA (которые используют модель шейдеров 2.0). Вы используете directx11, но пытаетесь скомпилировать его в профиль Shader Model 2. Это не поддерживается Вы должны переписать шейдер так, чтобы он соответствовал профилю шейдерной модели 5 (fx_5_0), или сконструировать ваше устройство с уровнем функций D3D_FEATURE_LEVEL_9_1 и скомпилировать свои шейдеры в качестве цели ps_4_0_level_9_1.
Несколько вещей из вашего шейдера не будут работать в шейдерной модели 5. Например, sample_state - это вещь Directx9. Начиная с Directx10 и выше, вы должны использовать группы типов сэмплера ( см. Здесь для получения дополнительной информации) Например:
SamplerState MeshTextureSampler
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
Некоторые другие вещи, которые не поддерживаются, включают:
magfilter = Point;
Вы должны преобразовать это в фильтр следующим образом:
Filter = MIN_MAG_LINEAR_MIP_POINT;
Это те вещи, которые я заметил, когда просматривал их. Надеюсь, это вам немного поможет.