Haven’t thought about the number of lightsources, yet, but if it is too hard to do with multiple I think I could get away with only one. I tried to create something using Strumpy’s Shader Editor, but I can’t figure out how to make the shader not use th lighting information for anything but blending the textures. The result is usable, but suboptimal, since the texture I want to use for the illuminated areas is nearly white and gets washed out completely with the additional brightness from the shading. But it has no limitation regarding the number of lightsources, without Pro.
Here is the code, if that helps:
Shader "ScreenProjectedTest"
{
Properties
{
_MainTex("Light", 2D) = "white" {}
_Shadow("Shadow", 2D) = "black" {}
}
SubShader
{
Tags
{
"Queue"="Geometry"
"IgnoreProjector"="False"
"RenderType"="Opaque"
}
Cull Back
ZWrite On
ZTest LEqual
ColorMask RGBA
Fog{
}
CGPROGRAM
#pragma surface surf BlinnPhongEditor nolightmap vertex:vert
#pragma target 2.0
sampler2D _MainTex;
sampler2D _Shadow;
struct EditorSurfaceOutput {
half3 Albedo;
half3 Normal;
half3 Emission;
half3 Gloss;
half Specular;
half Alpha;
half4 Custom;
};
inline half4 LightingBlinnPhongEditor_PrePass (EditorSurfaceOutput s, half4 light)
{
half3 spec = light.a * s.Gloss;
half4 c;
c.rgb = (s.Albedo * light.rgb + light.rgb * spec);
c.a = s.Alpha;
return c;
}
inline half4 LightingBlinnPhongEditor (EditorSurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
{
half3 h = normalize (lightDir + viewDir);
half diff = max (0, dot ( lightDir, s.Normal ));
float nh = max (0, dot (s.Normal, h));
float spec = pow (nh, s.Specular*128.0);
half4 res;
res.rgb = _LightColor0.rgb * diff;
res.w = spec * Luminance (_LightColor0.rgb);
res *= atten * 2.0;
return LightingBlinnPhongEditor_PrePass( s, res );
}
struct Input {
float4 screenPos;
float3 viewDir;
};
void vert (inout appdata_full v, out Input o) {
float4 VertexOutputMaster0_0_NoInput = float4(0,0,0,0);
float4 VertexOutputMaster0_1_NoInput = float4(0,0,0,0);
float4 VertexOutputMaster0_2_NoInput = float4(0,0,0,0);
float4 VertexOutputMaster0_3_NoInput = float4(0,0,0,0);
}
void surf (Input IN, inout EditorSurfaceOutput o) {
o.Normal = float3(0.0,0.0,1.0);
o.Alpha = 1.0;
o.Albedo = 0.0;
o.Emission = 0.0;
o.Gloss = 0.0;
o.Specular = 0.0;
o.Custom = 0.0;
float4 Tex2D1=tex2D(_Shadow,((IN.screenPos.xy/IN.screenPos.w).xyxy).xy);
float4 Tex2D0=tex2D(_MainTex,((IN.screenPos.xy/IN.screenPos.w).xyxy).xy);
float4 Luminance0= Luminance( float4(0.2125,.7154,0.072,0.0).xyz ).xxxx;
float4 Saturate0=saturate(Luminance0);
float4 Multiply0=Tex2D0 * Saturate0;
float4 Add0=Tex2D1 + Multiply0;
float4 Fresnel0_1_NoInput = float4(0,0,1,1);
float4 Fresnel0=(1.0 - dot( normalize( float4( IN.viewDir.x, IN.viewDir.y,IN.viewDir.z,1.0 ).xyz), normalize( Fresnel0_1_NoInput.xyz ) )).xxxx;
float4 Pow0=pow(Fresnel0,float4( 3,3,3,3 ));
float4 Invert0= float4(1.0, 1.0, 1.0, 1.0) - Pow0;
float4 Multiply1=Tex2D1 * Invert0;
float4 Master0_1_NoInput = float4(0,0,1,1);
float4 Master0_3_NoInput = float4(0,0,0,0);
float4 Master0_4_NoInput = float4(0,0,0,0);
float4 Master0_5_NoInput = float4(1,1,1,1);
float4 Master0_7_NoInput = float4(0,0,0,0);
float4 Master0_6_NoInput = float4(1,1,1,1);
o.Albedo = Add0;
o.Emission = Multiply1;
o.Normal = normalize(o.Normal);
}
ENDCG
}
Fallback "Diffuse"
}