为MonoGame编译着色器

时间:2014-01-02 22:32:59

标签: c# .net monogame

我正在使用VS 2013并试图让像素着色器正常工作。我已经在XNA 4中使用了这个着色器,所以我很确定它没问题。

我正在尝试使用2MGFX工具

编译着色器

刚刚开始

  

2MGFX.exe AlphaMap.fx AlphaMap.fxg

工作,我得到我编译的AlphaMap.fxg文件。

然而,当尝试在MonoGame中使用/加载此文件时,我得到:

  

MGFX效果是此平台的错误配置文件!

对此的修复似乎是将/ DX11添加到2MGFX命令,但后来我得到了这个错误:

  

像素着色器'PixelShaderFunction'必须是SM 4.0 9.1或更高级别!   无法编译输入文件'AlphaMap.fx'!

我做错了什么?

着色器代码。

uniform extern texture ScreenTexture;  
sampler screen = sampler_state 
{
    // get the texture we are trying to render.
    Texture = <ScreenTexture>;
};

uniform extern texture MaskTexture;  
sampler mask = sampler_state
{
    Texture = <MaskTexture>;
};

// here we do the real work. 
float4 PixelShaderFunction(float2 inCoord: TEXCOORD0) : COLOR
{

    float4 color = tex2D(screen, inCoord);
    color.rgba = color.rgba - tex2D(mask, inCoord).r;
    return color;
}

technique
{
    pass P0
    {
        // changed this to reflect fex answer
        PixelShader = compile ps_4_0_level_9_1 PixelShaderFunction();
    }
}

修改

fex的答案让我能够加载效果,但它似乎现在可以正常工作。

我这样使用它:

    Texture2D Planet = _Common.ContentManager.Load<Texture2D>("Materials/RedPlanet512");
    Texture2D AlphaMapp = _Common.ContentManager.Load<Texture2D>("Materials/Dots2");
    Effect AlphaShader = _Common.ContentManager.Load<Effect>("Effects/AlphaMap");

    AlphaShader.Parameters["MaskTexture"].SetValue(AlphaMapp);

    spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, AlphaShader, _Common.Camera.View);

    spriteBatch.Draw(Planet,
        new Vector2(0, 0),
        null, Color.White, 0f,
        new Vector2(Planet.Width / 2, Planet.Height / 2),
        1f, SpriteEffects.None, 1f);
    spriteBatch.End();

这些是我正在使用的纹理:

http://www.syntaxwarriors.com/wp-content/gallery/alphamapping-gallery/redplanet512.png http://www.syntaxwarriors.com/wp-content/gallery/alphamapping-gallery/whitedots_0.png

1 个答案:

答案 0 :(得分:7)

尝试更改此行:

    PixelShader = compile ps_2_0 PixelShaderFunction();

成:

    PixelShader = compile ps_4_0_level_9_1 PixelShaderFunction();

顺便说一下 - 为什么不使用MonoGame内容模板?