Shader bug after upgrade?

I upgraded my monogame to the latest version. When building the shader in the pipeline tool at first I got the error Vertex shader ‘SpriteVertexShader’ must be SM 4.0 level 9.1 or higher! So I changed ps_2_0 to ps_4_0_level_9_1 but now I’m getting the error:

error X3004: undeclared identifier ‘SecondPassTextureSampler’

Anybody have an idea on how to fix this issue?

#include "Macros.fxh"

texture Bitmap;

sampler2D FirstPassTexture = sampler_state{
    Texture = (Bitmap);
    MagFilter = Linear;
    MinFilter = Linear;
    AddressU = Clamp;
    AddressV = Clamp;
};

sampler2D SecondPassTexture = sampler_state{
    Texture = (Bitmap);
    MagFilter = Linear;
    MinFilter = Linear;
    AddressU = Clamp;
    AddressV = Clamp;
};

#define KERNEL_RADIUS 7
#define KERNEL_WIDTH (2*KERNEL_RADIUS + 1)

// Uniforms
BEGIN_CONSTANTS
    float kernel[KERNEL_WIDTH];
    float2 offsets[KERNEL_WIDTH];

MATRIX_CONSTANTS
    float4x4 MatrixTransform    _vs(c0) _cb(c0);
END_CONSTANTS

struct VSOutput
{
    float4 position     : SV_Position;
    float4 color        : COLOR0;
    float2 texCoord     : TEXCOORD0;
};

VSOutput SpriteVertexShader(    float4 position : SV_Position,
                                float4 color    : COLOR0,
                                float2 texCoord : TEXCOORD0)
{
    VSOutput output;
    output.position = mul(position, MatrixTransform);
    output.color = color;
    output.texCoord = texCoord;
    return output;
}

float4 gaussH(VSOutput input): SV_Target0
{
    float4 color = float4(0,0,0,0);
    for(int i = 0; i < KERNEL_WIDTH; ++i)
        color += SAMPLE_TEXTURE(SecondPassTexture, (input.texCoord + float2(offsets[i].x, 0.0) )) * kernel[i];
    return color * input.color;
}

float4 gaussV(VSOutput input): SV_Target0
{
    float4 color = float4(0.0,0.0,0.0,0);
    for(int i = 0; i < KERNEL_WIDTH; ++i)
        color += SAMPLE_TEXTURE(SecondPassTexture, (input.texCoord + float2(0.0, offsets[i].y) )) * kernel[i];
    return color * input.color;
}

float4 gaussVGlow(VSOutput input): SV_Target0
{
    float4 color = float4(1.0,1.0,1.0,0);
    for(int i = 0; i < KERNEL_WIDTH; ++i)
    {
        float alpha = SAMPLE_TEXTURE(SecondPassTexture, (input.texCoord + float2(0.0, offsets[i].y) )).a * kernel[i];
        color.a += alpha;
    }
    // This will make stripes on top of the glow
    /*
    float m = smoothstep(0.45, 0.55, 0.5*cos(25.0*atan2(input.texCoord.y-0.5, input.texCoord.x-0.5))+0.5) * 0.5 + 0.5;
    color.a *= m;
    */
    color.a = pow(color.a, 0.5);
    color.rgb *= color.a; // Yeah, you have to pre multiply your alpha -- either that or render with premultiply option
    return color * input.color;
}

technique Blur {
    pass p0 {
        VertexShader = compile vs_4_0_level_9_1 SpriteVertexShader();
        PixelShader = compile ps_4_0_level_9_1 gaussH();
    }
    pass p1 {
        VertexShader = compile vs_4_0_level_9_1 SpriteVertexShader();
        PixelShader = compile ps_4_0_level_9_1 gaussV();
    }
    pass p1Glow {
        VertexShader = compile vs_4_0_level_9_1 SpriteVertexShader();
        PixelShader = compile ps_4_0_level_9_1 gaussVGlow();
    }
}

Macros.fxh is: http://pastebin.com/y51kFfii

Try to rename the sampler SecondPassTexture to SecondPassTextureSampler.

Doesn’t work, gives me the error X3004: undeclared identifier ‘SecondPassTextureSamplerSampler’

You get an error because you use the macro SAMPLE_TEXTURE for sampling, but do not use the macro DECLARE_TEXTURE for declaring the texture.
If you want to use the macros in Macros.fxh then the texture needs to be named SecondPassTexture and the sampler needs to be named SecondPassTextureSampler. (Do not change the line where SAMPLE_TEXTURE is called.)

If you look at the macro (_Macro.fxh, line 31), the code

SAMPLE_TEXTURE(SecondPassTexture, (input.texCoord + float2(0.0, offsets[i].y) ))

expands to

 SecondPassTexture.Sample(SecondPassTextureSampler, (input.texCoord + float2(0.0, offsets[i].y) ))

But in your case (original post) it should be

Bitmap.Sample(SecondPassTexture, (input.texCoord + float2(0.0, offsets[i].y) ))

Here is a simpler solution, you can try:
Just replace all SAMPLE_TEXTURE with tex2D. (Leave the samplers as in the original post.)

1 Like

Thanks, it seems to have worked, though now it just crashes with no error message every time I try to build…