Custom decal compile error only in OpenGL

My customized decal shader can not be compiled to OpenGL because of the following
error:

Stuff works fine in dx9.
Here is the shader:

Shader "OMD/Base Decal Add"
{
  Properties
  {
  	  _Color ("Main color", Vector) = (1,1,1,1)   	
     _DecalTexture ("Decal", 2D) = "gray" { TexGen ObjectLinear }
     _DecalOffsetTiling("Decal offset/tiling", Vector) = (0,0,1,1)
     _FalloffTexture("Falloff", 2D) = "white" { TexGen ObjectLinear }
     _FalloffContrast("Falloff contrast", Float) = 8
  }

  Subshader
  {
    Tags
    {
      "RenderType"="Transparent"
      "Queue"="Transparent+100"
    }

    Pass
    {
      ZWrite Off
      Offset -1, -1
      Fog { Mode Off }
      ColorMask RGB
      Blend One One

      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      #pragma only_renderers d3d9 opengl
      #include "UnityCG.cginc"
       
      // User-specified properties
      uniform float4 _Color;
      uniform sampler2D _DecalTexture;
      uniform float4 _DecalOffsetTiling;
      uniform sampler2D _FalloffTexture;
      uniform float _FalloffContrast;

      // Projector-specific uniforms
      uniform float4x4 _Projector; // transformation matrix from object space to projector space
      uniform float4x4 _ProjectorClip;

      struct vertexInput
      {
        float4 vertex : POSITION;
        float3 normal : NORMAL;
      };

      struct vertexOutput
      {
        float4 pos : SV_POSITION;
        float4 posProj : TEXCOORD0; // position in projector space
        float4 uv : TEXCOORD1;
      };
       
      vertexOutput vert(vertexInput input)
      {
        vertexOutput output;

        output.posProj = mul(_Projector, input.vertex);
        output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
        output.uv =  mul(_ProjectorClip, input.vertex);

        return output;
      }

      float4 frag(vertexOutput input) : COLOR
      {
        float4 returnValue = float4(0);

        if (input.posProj.w > 0.0) // in front of projector?
        {
          float4 finalProjectionUVs = UNITY_PROJ_COORD(input.posProj);
          finalProjectionUVs = (finalProjectionUVs * float4(_DecalOffsetTiling.z,_DecalOffsetTiling.w,1,1));
          finalProjectionUVs = finalProjectionUVs + float4(_DecalOffsetTiling.x, _DecalOffsetTiling.y, 0, 0);
          finalProjectionUVs.x = clamp(finalProjectionUVs.x, _DecalOffsetTiling.x, _DecalOffsetTiling.x + _DecalOffsetTiling.z);
          finalProjectionUVs.y = clamp(finalProjectionUVs.y, _DecalOffsetTiling.y, _DecalOffsetTiling.y + _DecalOffsetTiling.w);

          float4 decalTexture = tex2Dproj(_DecalTexture, finalProjectionUVs) * _Color;
          float finalFalloff = tex2Dproj(_FalloffTexture, UNITY_PROJ_COORD(input.uv)).a;
          float finalContrast = lerp(_FalloffContrast, 1, finalFalloff);

          returnValue = pow(decalTexture, finalContrast) * finalFalloff;
        }

        return returnValue;
      }

      ENDCG
    }
  }
}

So the problem lies with float4 finalProjectionUVs = UNITY_PROJ_COORD(input.posProj);
Check HLSLSupport.cginc where UNITY_PROJ_COORD is defined.

#if defined(SHADER_API_OPENGL)  !defined(SHADER_TARGET_GLSL)
#define UNITY_BUGGY_TEX2DPROJ4
#define UNITY_PROJ_COORD(a) (a).xyw
#else
#define UNITY_PROJ_COORD(a) a
#endif

So when compiling to ARB (desktop OpenGL), it expects three channels, not 4.

Ah I see, thanks!