- Home /
Custom Shader makes sprite darker (unintended side effect)
Let me just start off by saying that my experience with this subject is very little indeed. I wrote with the help of online tutorials a custom shader to make certain colored pixels transparent. But an unintended side effect was that my sprites turn much darker:
Is this a gamma issue or perhaps something to do with shadows I wonder?
*Edit - code now included
Shader "Custom/transparent-color" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_TransparentColor ("Transparent Color", Color) = (1,1,1,1)
_Threshold ("Threshhold", Float) = 0.1
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert alpha
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
fixed4 _Color;
fixed4 _TransparentColor;
half _Threshold;
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
half4 output_col = c * _Color;
half3 transparent_diff = c.xyz - _TransparentColor.xyz;
half transparent_diff_squared = dot(transparent_diff,transparent_diff);
if(transparent_diff_squared < _Threshold)
discard;
o.Albedo = output_col.rgb;
o.Alpha = output_col.a;
}
ENDCG
}
FallBack "Diffuse"
}
Ah sorry, I really should have included it originally. I've edited it in.
You don't seem to use the alpha value in any way. Why do you have the shader in the transparent render queue? You haven't enabled any kind of alpha blending so that seems to be a bit strange. When using "discard" the big advantage is that you can keep the shader an opaque shader. So the objects don't need to be depth sorted for blending.
In your screenshot it's hard to tell which parts acually belongs together. Finally how many lights and what kind of lights do you use in your scene?
Answer by cjdev · Oct 21, 2015 at 06:34 PM
Because you're multiplying your color from your tex2D by your Color variable, if you assign any Color other than white you're going to get a darker color than your tex2D input as a result of the multiplication operation since the Color value is a number from 0-1. Try using a different blending formula for the Color and tex2D inputs to get the output you're looking for.
Your answer
Follow this Question
Related Questions
2D Sprite Shader Acting like Light 0 Answers
Skew a sprite at runtime while preserving the pixel shape? 1 Answer
Blend colors in overlapping areas. 1 Answer
Are shaders more efficient than manual pixel replacement? 0 Answers
Grass shader sprite 2D 3 Answers