Question by
umirza47 · Mar 02, 2016 at 06:26 AM ·
shadowsshader programmingshaderlabshader writingshadow bug
vert/frag custom shader - Shadow is not correct, showing strange artifacts
I am new to shader writing, I want to drop shadows in my own shader, but unluckily I am getting a strange behaviour. When I apply a simple surface shader (Lambert, written in unity shader lab) it shows proper shadows, When I translate that into vert/frag shader. It is showing shadow with in an improper way.
Please see the image below for detail.
I would like to read a lot on it how it calculates attenuation, I have read shadow mapping but I want to know the exact thing which is wrong.
Following is the code,
Shader "Umirza47/NonSurf/Lambert"
{
Properties
{
_Color ("Color", Color) = (1.0,1.0,1.0,1.0)
}
CGINCLUDE
#include "UnityCG.cginc"
#include "AutoLight.cginc"
#include "Lighting.cginc"
ENDCG
SubShader
{
LOD 200
Tags { "RenderType"="Opaque" }
Pass {
Lighting On
Tags {"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
uniform half4 _Color;
struct vertexInput
{
half4 vertex : POSITION;
half3 normal : NORMAL;
};
struct vertexOutput
{
half4 pos : SV_POSITION;
fixed4 lightDirection : TEXCOORD1;
fixed3 viewDirection : TEXCOORD2;
fixed3 normalWorld : TEXCOORD3;
LIGHTING_COORDS(4,6)
};
vertexOutput vert (vertexInput v)
{
vertexOutput o;
half4 posWorld = mul( _Object2World, v.vertex );
o.normalWorld = normalize( mul(half4(v.normal, 0.0), _World2Object).xyz );
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.viewDirection = normalize(_WorldSpaceCameraPos.xyz - posWorld.xyz);
TRANSFER_VERTEX_TO_FRAGMENT(o);
return o;
}
half4 frag (vertexOutput i) : COLOR
{
fixed NdotL = dot(i.normalWorld, i.lightDirection);
half atten = LIGHT_ATTENUATION(i);
fixed3 diffuseReflection = _LightColor0.rgb * atten * _Color.rgb;
fixed3 finalColor = UNITY_LIGHTMODEL_AMBIENT.xyz + diffuseReflection;
return float4(finalColor, 1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
capture.png
(55.9 kB)
Comment