- Home /
Making a more blocky lighting shader
My game is a 1 worldspace unit : 1 pixel game, and I have sprites with normal maps that react to lights in expected ways. However, since an art pixel has 4 screen pixels on normal resolutions, Unity's lighting will create a kind of artifacting, which is most apparent at the boundary of scene lights. Each screen pixel will have its own lighting calculated, causing sub-pixels of the intended art pixels to have different lighting than other subpixels of the same art pixel:
Looking especially at the top left border of the door light, the sub pixel effect can be seen.
What I'd like to do is have uniform lighting for each ART pixel. One problem is that because I'm using a surface shader for diffuse lighting, lying to the engine about the fragment location might be difficult? A solution here would involve something like having all lighting calculations be done for their worldspace rounded down to the nearest integer, so in the example, subpixels at world locations (17.0, 14.0), (17.5, 14.0), (17.0, 14.5), and (17.5,14.5) would all be calculated as though they were at world location (17.0, 14.0), because all those subpixel locations are part of the same art pixel.
Here is the current shader, just for reference:
Shader "Sprites/Emissive Bumped Diffuse both sides with Shadows"
{
Properties
{
[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
_BumpMap("Normalmap", 2D) = "bump" {}
_BumpIntensity("NormalMap Intensity", Range(-1, 2)) = 1
_Color("Tint", Color) = (1,1,1,1)
[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
_Cutoff("Alpha Cutoff", Range(0,1)) = 0.5
_Brightness("Brightness Addition", Range(0,1)) = 0
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "TransparentCutOut"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
}
LOD 300
// Render back faces first
Cull Front
Lighting On
ZWrite Off
Fog{ Mode Off }
CGPROGRAM
#pragma surface surf Lambert alpha vertex:vert addshadow alphatest:_Cutoff
#pragma multi_compile DUMMY PIXELSNAP_ON
sampler2D _MainTex;
sampler2D _BumpMap;
fixed _BumpIntensity;
fixed4 _Color;
float _ScaleX;
float _Brightness;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
fixed4 color : COLOR;
};
void vert(inout appdata_full v, out Input o)
{
#if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH)
v.vertex = UnityPixelSnap(v.vertex);
#endif
float3 normal = v.normal;
v.normal = float3(0,0,-1);
v.tangent = float4(1, 0, 0, 1);
UNITY_INITIALIZE_OUTPUT(Input, o);
o.color += _Color;
}
void surf(Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
o.Albedo = c.rgb;
o.Alpha = c.a;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
_BumpIntensity = 1 / _BumpIntensity;
o.Normal.z = o.Normal.z * _BumpIntensity;
o.Normal = normalize((half3)o.Normal);
o.Emission = c.rgb *_Brightness;
}
ENDCG
// Now render front faces first
Cull Back
Lighting On
ZWrite Off
Fog{ Mode Off }
CGPROGRAM
#pragma surface surf Lambert alpha vertex:vert addshadow alphatest:_Cutoff
#pragma multi_compile DUMMY PIXELSNAP_ON
sampler2D _MainTex;
sampler2D _BumpMap;
fixed _BumpIntensity;
fixed4 _Color;
float _ScaleX;
float _Brightness;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
fixed4 color : COLOR;
};
void vert(inout appdata_full v, out Input o)
{
#if defined(PIXELSNAP_ON) && !defined(SHADER_API_FLASH)
v.vertex = UnityPixelSnap(v.vertex);
#endif
float3 normal = v.normal;
v.normal = float3(0,0,1);
v.tangent = float4(1, 0, 0, 1);
UNITY_INITIALIZE_OUTPUT(Input, o);
o.color += _Color;
}
void surf(Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * IN.color;
o.Albedo = c.rgb;
o.Alpha = c.a;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
_BumpIntensity = 1 / _BumpIntensity;
o.Normal.z = o.Normal.z * _BumpIntensity;
o.Normal = normalize((half3)o.Normal);
o.Normal.z *= -1;
o.Emission = c.rgb *_Brightness;
}
ENDCG
}
Fallback "Transparent/Cutout/Diffuse"
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613004512im_/https://answers.unity.com/themes/thub/images/avi.jpg)