无法在xna中运行的slimdx中编译相同的着色器?

时间:2012-06-19 17:23:07

标签: c# shader slimdx

我正在尝试在slimdx中加载FX文件,我已经加载了这个精确的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 个答案:

答案 0 :(得分:2)

如果我没记错的话,byte4是来自XNA的reach / hd配置文件(使用着色器模型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组。(See here for more info)例如:

SamplerState MeshTextureSampler
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

其他一些不受支持的事情包括:

magfilter = Point;

你必须将那个转换成如下过滤器:

Filter = MIN_MAG_LINEAR_MIP_POINT;

这些是我在扫描时发现的东西。我希望这对你有所帮助。