- Home /
specular shader alpha not working?
The effect I'm trying to achieve is a glass-like surface off of which any specular highlight is more "opaque" than the base material alpha. From what I can see, the built-in transparent specular shader thinks it's doing this, but I've pulled out my own copy to demonstrate how it seems not to be...
fixed4 LightingCustomSpecular (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {
fixed3 h = normalize (lightDir + viewDir);
fixed diff = max (0, dot (s.Normal, lightDir));
float nh = max (0, dot (s.Normal, h));
float spec = pow (nh, s.Specular*128.0) * s.Gloss;
fixed4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);
c.a = 1.0;//s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;
return c;
}
Note where the output c.a is set straight to 1.0 rather than the intended base alpha + additional shininess. When rendered, the object still comes out at the 20% opacity of the input base color. When I force the alpha output of the surface initializer
void surf (Input IN, inout SurfaceOutput o) {
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = tex.rgb * _Color.rgb;
o.Gloss = tex.a;
o.Alpha = tex.a * _Color.a;
o.Specular = _Shininess;
}
to 1.0 (o.Alpha = 1.0;//tex.a * _Color.a;), of course the object renders full opaque, showing the shader as a whole is connected properly.
Any idea, then, why the alpha output of the lighting model function is not being honored? I thought it might just be postmultiplying the base alpha somehow, but a forced alpha of 1.0 in surf() and 0.5 in LightingCustomSpecular still renders as 1.0 opaque, so that's not the problem either...
Your answer
Follow this Question
Related Questions
Shader alpha setting being ignored? 1 Answer
Making the Specular map separate in a shader (not as alpha)? 2 Answers
How to make a specular shader fully transparent 0 Answers
Glass Shader with Strumpy Shader Editor 1 Answer
About shader! 0 Answers