- Home /
Recieving Shadow on Custom Shader
Basically I've got this custom shader for silhouette highlight from Unity3d Wiki... (I Know nothing about Shaders... purely programming background). I want this Shader to recieve shadow casted by other objects
Shader code:
Shader "Outlined/Silhouetted Diffuse" {
Properties{
_Color("Main Color", Color) = (.5,.5,.5,1)
_OutlineColor("Outline Color", Color) = (0,0,0,1)
_Outline("Outline width", Range(0.0, 0.03)) = .005
_MainTex("Base (RGB)", 2D) = "white" { }
}
CGINCLUDE
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : POSITION;
float4 color : COLOR;
};
uniform float _Outline;
uniform float4 _OutlineColor;
v2f vert(appdata v) {
// just make a copy of incoming vertex data but scaled according to normal direction
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);
float2 offset = TransformViewToProjection(norm.xy);
o.pos.xy += offset * o.pos.z * _Outline;
o.color = _OutlineColor;
return o;
}
ENDCG
SubShader{
Tags{ "Queue" = "Transparent" }
// note that a vertex shader is specified here but its using the one above
Pass{
Name "OUTLINE"
Tags{ "LightMode" = "Always" }
Cull Off
ZWrite Off
ZTest Always
ColorMask RGB // alpha not used
// you can choose what kind of blending mode you want for the outline
Blend SrcAlpha OneMinusSrcAlpha // Normal
//Blend One One // Additive
//Blend One OneMinusDstColor // Soft Additive
//Blend DstColor Zero // Multiplicative
//Blend DstColor SrcColor // 2x Multiplicative
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) :COLOR{
return i.color;
}
ENDCG
}
Pass{
Name "BASE"
ZWrite On
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
Material{
Diffuse[_Color]
Ambient[_Color]
}
Lighting On
SetTexture[_MainTex]{
ConstantColor[_Color]
Combine texture * constant
}
SetTexture[_MainTex]{
Combine previous * primary DOUBLE
}
}
}
SubShader{
Tags{ "Queue" = "Transparent" }
Pass{
Name "OUTLINE"
Tags{ "LightMode" = "Always" }
Cull Front
ZWrite Off
ZTest Always
ColorMask RGB
// you can choose what kind of blending mode you want for the outline
Blend SrcAlpha OneMinusSrcAlpha // Normal
//Blend One One // Additive
//Blend One OneMinusDstColor // Soft Additive
//Blend DstColor Zero // Multiplicative
//Blend DstColor SrcColor // 2x Multiplicative
CGPROGRAM
#pragma vertex vert
#pragma exclude_renderers gles xbox360 ps3
ENDCG
SetTexture[_MainTex]{ combine primary }
}
Pass{
Name "BASE"
ZWrite On
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
Material{
Diffuse[_Color]
Ambient[_Color]
}
Lighting On
SetTexture[_MainTex]{
ConstantColor[_Color]
Combine texture * constant
}
SetTexture[_MainTex]{
Combine previous * primary DOUBLE
}
}
}
Fallback "Diffuse"
}
Answer by Namey5 · Jul 06, 2017 at 07:17 AM
Basically; you can't. The shader relies on the transparent render queue (I'm assuming from the code) and there is no way in Unity (currently) to render shadows on transparent objects without creating your own lighting/shadow system, or essentially hacks. I did develop a transparent shader to receive shadows from Unity lights, but it's somewhat impractical and unreliable. Transparent shadow receivers have been on the Unity roadmap for a while now, and I believe were supposed to be brought in by Unity 5, but that didn't happen.
Your answer
Follow this Question
Related Questions
How to use a sprite/mesh shader to light up behind it? 1 Answer
Any way to get rid of squares (artifacts) in a semi transparent shadow of a fade shader? 0 Answers
Odd shadow effect, help! 1 Answer
Transparent objects and shadow 0 Answers
Custom Lighting shader issue w Spot/Point lights and atten 0 Answers