Не можете скомпилировать тот же шейдер в 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;

Это те вещи, которые я заметил, когда просматривал их. Надеюсь, это вам немного поможет.

Другие вопросы по тегам