- Home /
Having problems with unlit shaders casting shadows
So I've been trying to figure this out on my own but so far I am having absolutely no luck.
I have tried a handful of shaders I've found online but they all seem to have the same problem.
I am using unity 5.3. I have simple scene set up with a character model in the center. I have the character model in the center of the screen and I've applied one of the many unlit with shadows shaders I've found online. However, the part of the body that is recieving shadows from itself is almost black.
I was wondering if there was something I could change in the script I'm using. Here is what I am seeing:
And here is what it looks like when the directional light shadows are set to 0.5 strength. This is a little more like what I want but I want to be able to keep the directional light shadow strength at 1
Here is an example of a shader I'm using.
Shader "Custom/Unlit With Shadows" {
Properties{
_Color("Main Color", Color) = (1,1,1,1)
_MainTex("Base (RGB)", 2D) = "white" {}
}
SubShader{
Tags{ "Queue" = "Geometry" "RenderType" = "Opaque" }
Pass{
Tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
#include "AutoLight.cginc"
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
LIGHTING_COORDS(1,2)
};
float4 _MainTex_ST;
v2f vert(appdata_tan v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex).xy;
TRANSFER_VERTEX_TO_FRAGMENT(o);
return o;
}
sampler2D _MainTex;
fixed4 frag(v2f i) : COLOR
{
fixed atten = LIGHT_ATTENUATION(i); // Light attenuation + shadows.
//fixed atten = SHADOW_ATTENUATION(i); // Shadows ONLY.
return tex2D(_MainTex, i.uv) * atten;
}
ENDCG
}
Pass{
Tags{ "LightMode" = "ForwardAdd" }
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdadd_fullshadows
#pragma fragmentoption ARB_fog_exp2
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
#include "AutoLight.cginc"
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
LIGHTING_COORDS(1,2)
};
float4 _MainTex_ST;
v2f vert(appdata_tan v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex).xy;
TRANSFER_VERTEX_TO_FRAGMENT(o);
return o;
}
sampler2D _MainTex;
fixed4 frag(v2f i) : COLOR
{
fixed atten = LIGHT_ATTENUATION(i); // Light attenuation + shadows.
//fixed atten = SHADOW_ATTENUATION(i); // Shadows ONLY.
return tex2D(_MainTex, i.uv) * atten;
}
ENDCG
}
}
FallBack "VertexLit"
}
Is there anything I can do/change in this .shader file that will help me out?
Edit: I also noticed that my model will not cast shadows on itself when using point and spot lights. This looks to be the same with all of the unlit with shadows shaders I've found. Is there a remedy to that?
If you want an unlit shader, there isn't really a point using one that receives lighting, or am I misunderstanding the effect you wish to achieve. The shadow casting is done in a separate pass, and as such lighting in the other passes is not necessary.
I was using the unlit with shadows shader because out of all of the built in shaders the Unlit one gave my models the look I wanted. I used a voxel tool to build my characters and I guess what I want to accomplish was a look similar to what I see in my editor.
When I use the Unity standard shader it picks out every edge and to me doesn't look too great.
However, with the 'flat' look of the unlit shader combined with the softer shadowing gave me exactly what I wanted. The only problem I am having is with how intense the shadows look when the directional light shadows are set to 1 and that spot and point lights don't effect the shadows on the model at all (shadows are cast on the ground though).
If I'm approaching this the wrong way I'd love some input. If there is a different/better way to build a shader to do what I want I'd totally learn that method ins$$anonymous$$d
Well, the problem is that you are using an unlit shader but calculating lighting and attenuation, and as such the shader is receiving shadows. All you would need to do is use a default unlit shader which simply returns a colour value and a separate shadow casting pass. Do you want it to receive shadows as well as cast them?
Your answer
Follow this Question
Related Questions
I need swaying, self-shadowing, ultra-realistic grass 0 Answers
Mask Shader and Shadow 2 Answers
Toon shader light culling shadow issue 0 Answers
depth mask braking lighting 0 Answers
Is there a way to Separate the light contribution from the shadow? 0 Answers