Its a projector, its not the fastest, but it looks good. Its blend equation is set right now to multiply. That's fine but:
Multiply darkens the blend, making it hard to see in dark places. So, I try an additive blend:
So that looks better. Only it does the opposite: in bright areas, its hard to see:
More so in very bright areas:
So in the end, I am forced to use a normal alpha-blend equation. It looks plain, but is sure to be visible in both bright and dark areas:
Unfortunately, you can't emulate the blend types in Photoshop like Overlay, because blending equations in videocards are fixed-function.
Here's the Unity shaderlab code for alpha-blended projectors:
Shader "Projector/Diffuse" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _ShadowTex ("Cookie", 2D) = "" { TexGen ObjectLinear } } Subshader { Tags { "RenderType"="Transparent" "Queue"="Transparent"} Pass { ZWrite off Fog { Color (0, 0, 0) } Color [_Color] ColorMask RGB Offset -1, -1 Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma fragmentoption ARB_fog_exp2 #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" sampler2D _ShadowTex; float4x4 _Projector; fixed4 _Color; struct v2f { float4 vertex : SV_POSITION; float4 texcoord : TEXCOORD0; }; v2f vert (appdata_tan v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.texcoord = mul(_Projector, v.vertex); return o; } half4 frag (v2f i) : COLOR { return tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.texcoord)) * _Color; } ENDCG } } }