1

私はslimdxでFXファイルをロードしようとしています。XNA4.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を使用していますが、ShaderModel2プロファイルにコンパイルしようとしています。これはサポートされていません。シェーダーモデル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 に答える