1

我正在尝试在 slimdx 中加载 FX 文件,我已经使用 XNA 4.0 加载和编译了这个精确的 FX 文件,但是我遇到了 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'
4

1 回答 1

2

如果我没记错的话,byte4 来自 XNA(使用着色器模型 2.0)的reach/hd 配置文件。您正在使用 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 组。(有关更多信息,请参见此处)例如:

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

其他一些不受支持的内容包括:

magfilter = Point;

您必须将其转换为这样的过滤器:

Filter = MIN_MAG_LINEAR_MIP_POINT;

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

于 2012-06-19T18:41:48.640 回答