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
}
}
}