- Home /
Team color shader in 2d game causing mysterious rectangles in other graphics
It's a 2D game in Unity 2020.3.17 Sometimes rectangles appear in the game window in editor, they are not visible in scene view. They also frequently appear in builds.
I deleted all game objects besides 1 UI rectangle which is using sprites default shader, to show that the rectangles are there. There were no other game objects in the scene with any graphic components.
The rectangles disappear when changing game window resolution (size) in editor. They also frequently disappear when restarting the game in unity editor.
If I got rid of the custom shader, they no longer appeared. The shader tints sprites based on hue of the pixels. It works well for the purpose but has this unpleasant rectangle artifacts on graphics that dont even use the material that uses the shader.
Shader "Custom/shader2"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_HueFloat("HueFloat", float) = 0.3
_AlphaFloat("AlphaFloat", float) = 1
}
SubShader
{
Cull Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _HueFloat;
float _AlphaFloat;
float3 rgb2hsv(float4 c)
{
float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g));
float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r));
float d = q.x - min(q.w, q.y);
float e = 1.0e-10;
return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}
float3 hsb2rgb(float3 c) {
float3 rgb = clamp(abs(fmod(c.x*6.0 + float3(0.0, 4.0, 2.0), 6) - 3.0) - 1.0, 0, 1);
rgb = rgb * rgb*(3.0 - 2.0*rgb);
return c.z * lerp(float3(1, 1, 1), rgb, c.y);
}
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex); // v.texcoord;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 c4 = tex2D(_MainTex, i.uv); // sample the texture
float3 hsb = rgb2hsv(c4);
if (hsb.x > 0.85 && hsb.x < 0.95)
hsb.x = _HueFloat; //0.3
float3 rgb = hsb2rgb(hsb);
c4.r = rgb.r;
c4.g = rgb.g;
c4.b = rgb.b;
c4.a *= _AlphaFloat;
return c4;
}
ENDCG
}
}
}
The canvas is screen-space overlay. The camera is ortographic.
Your answer