我正在尝试在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'
答案 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;
这些是我在扫描时发现的东西。我希望这对你有所帮助。