OpenGL shader differences

I have a simple ‘transition’ shader that returns either the pixel from texture A or texture B depending on the state of the M texture. See below.

When using DirectX both versions/attempts work fine. But in OpenGL instead of returning texture B it seems to return M. Making the result is either A or M instead of A or B.

I am not very good with shaders, and obviously there is some difference in OpenGL I am unaware of. Any help would be appreciated.

//_______________________________
// TransitionShader .fx
//
#if SM4
	#define PS_PROFILE ps_4_0
	#define VS_PROFILE vs_4_0
#else
	#define PS_PROFILE ps_3_0
	#define VS_PROFILE vs_3_0
#endif

// the textures
Texture2D TextureA;
sampler2D TextureSamplerA = sampler_state
{
    Texture = <TextureA>;
};

Texture2D TextureB;
sampler2D TextureSamplerB = sampler_state
{
    Texture = <TextureB>;
};

Texture2D TextureMask;
sampler2D TextureSamplerMask = sampler_state
{
    Texture = <TextureMask>;
};

float4 Merge( float4 inPosition : SV_Position,
			    float4 inColor : COLOR0,
			    float2 coords : TEXCOORD0 ) : COLOR0
{
    float4 output;
    float4 M = tex2D(TextureSamplerMask, coords);
    float4 A = tex2D(TextureSamplerA, coords);
    float4 B = tex2D(TextureSamplerB, coords);
    
    // Second Attempt
    if (M.r > 0.5) return A;
    return B;

    // First Attempt 
    //  output.rgb = (B.rgb * M.r) + (A.rgb * (1 - M.r));
    //  output.a = 1;
    //  return output;
}

technique Technique1
{
    pass P1
    {
        PixelShader = compile PS_PROFILE Merge();
    }
}

I rewrote my transitions to use BlendState instead of a Pixel Shader. Faster that way anyway, but I still have no Idea why OpenGL performs different here and would love to know for my sanity. :slight_smile: