Again, I very much appreciate your help!
The background is now working perfectly. It’s exactly as you described it should work. I used a standard specular, the emission channel to the texture/uv and albedo and specular to 0.
[EDIT: Wait sorry, disregard this section below. I think you’ve already answered this in your response, when you said: “You need to be writing to SV_Target3 if you want it to remain unlit.”]
You were right also that there was blending going on. First, I tried turning blending off completely. That turned the sprite into a white box that was still accepting light. I tried different non additive blending modes and finally I tried blending mode off with a clip function inside CPROGRAM. This replicated the original blending for some reason.

Somehow, the color being put onto the surface is already based on light sources
// Upgrade NOTE: commented out 'float4x4 _CameraToWorld', a built-in variable
// Upgrade NOTE: replaced '_CameraToWorld' with 'unity_CameraToWorld'
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// http://www.popekim.com/2012/10/siggraph-2012-screen-space-decals-in.html
Shader "Decal/DecalShader Unlit"
{
Properties
{
_MainTex ("Diffuse", 2D) = "white" {}
}
SubShader
{
Pass
{
Fog { Mode Off } // no fog in g-buffers pass
ZWrite Off
//Blend SrcAlpha OneMinusSrcAlpha
//Tried many different blend modes
Blend Off
//AlphaTest Greater [0.]
//BlendOp Max
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#pragma exclude_renderers nomrt
#include "UnityCG.cginc"
struct v2f
{
float4 pos : SV_POSITION;
half2 uv : TEXCOORD0;
float4 screenUV : TEXCOORD1;
float3 ray : TEXCOORD2;
half3 orientation : TEXCOORD3;
};
v2f vert (float3 v : POSITION)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, float4(v,1));
o.uv = v.xz+0.5;
o.screenUV = ComputeScreenPos (o.pos);
o.ray = mul (UNITY_MATRIX_MV, float4(v,1)).xyz * float3(-1,-1,1);
o.orientation = mul ((float3x3)unity_ObjectToWorld, float3(0,1,0));
return o;
}
CBUFFER_START(UnityPerCamera2)
// float4x4 _CameraToWorld;
CBUFFER_END
sampler2D _MainTex;
sampler2D_float _CameraDepthTexture;
sampler2D _NormalsCopy;
//void frag(
// v2f i,
// out half4 outDiffuse : COLOR0, // RT0: diffuse color (rgb), --unused-- (a)
// out half4 outSpecRoughness : COLOR1, // RT1: spec color (rgb), roughness (a)
// out half4 outNormal : COLOR2, // RT2: normal (rgb), --unused-- (a)
// out half4 outEmission : COLOR3 // RT3: emission (rgb), --unused-- (a)
//)
fixed4 frag(v2f i) : SV_Target
{
i.ray = i.ray * (_ProjectionParams.z / i.ray.z);
float2 uv = i.screenUV.xy / i.screenUV.w;
// read depth and reconstruct world position
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv);
depth = Linear01Depth (depth);
float4 vpos = float4(i.ray * depth,1);
float3 wpos = mul (unity_CameraToWorld, vpos).xyz;
float3 opos = mul (unity_WorldToObject, float4(wpos,1)).xyz;
clip (float3(0.5,0.5,0.5) - abs(opos.xyz));
i.uv = opos.xz+0.5;
half3 normal = tex2D(_NormalsCopy, uv).rgb;
fixed3 wnormal = normal.rgb * 2.0 - 1.0;
clip (dot(wnormal, i.orientation) - 0.3);
fixed4 col = tex2D (_MainTex, i.uv);
//fixed4 col = fixed4(1.0, 0., 0., 1.);
//Ended up using clip to remove pixels that weren't high enough alhpa
clip(col.a - .5);
return col;
}
ENDCG
}
}
Fallback Off
}
Finally, on your last point, it’s clear that I’ll need to read up on and understand deferred rendering to figure out if I need to change the overall method. Thank you for your guidance.