- Home /
Question by
ReinholdRunner · Oct 21, 2019 at 08:39 PM ·
shadershadersshadows
Adding shadows to custom shader
I know nothing about shaders and copied a shader from the internet with a fresnel effect I liked. It seems like the shaders doesn't support receiving shadows yet. How can I change the shaders code to add shadows?
Thanks in advance!
Shader "Custom/Fresnel" {
//show values to edit in inspector
Properties {
_Color ("Tint", Color) = (0, 0, 0, 1)
_MainTex ("Texture", 2D) = "white" {}
_Smoothness ("Smoothness", Range(0, 1)) = 0
_Metallic ("Metalness", Range(0, 1)) = 0
[HDR] _Emission ("Emission", color) = (0,0,0)
_FresnelColor ("Fresnel Color", Color) = (1,1,1,1)
[PowerSlider(4)] _FresnelExponent ("Fresnel Exponent", Range(0.25, 4)) = 1
}
SubShader {
//the material is completely non-transparent and is rendered at the same time as the other opaque geometry
Tags{ "RenderType"="Transparent" "Queue"="Transparent"}
LOD 100
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
//the shader is a surface shader, meaning that it will be extended by unity in the background to have fancy lighting and other features
//our surface shader function is called surf and we use the standard lighting model, which means PBR lighting
//fullforwardshadows makes sure unity adds the shadow passes the shader might need
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
fixed4 _Color;
half _Smoothness;
half _Metallic;
half3 _Emission;
float3 _FresnelColor;
float _FresnelExponent;
//input struct which is automatically filled by unity
struct Input {
float2 uv_MainTex;
float3 worldNormal;
float3 viewDir;
INTERNAL_DATA
};
//the surface shader function which sets parameters the lighting function then uses
void surf (Input i, inout SurfaceOutputStandard o) {
//sample and tint albedo texture
fixed4 col = tex2D(_MainTex, i.uv_MainTex);
col.a = 0;
col *= _Color;
o.Albedo = col.rgb;
//just apply the values for metalness and smoothness
o.Metallic = _Metallic;
o.Smoothness = _Smoothness;
//get the dot product between the normal and the view direction
float fresnel = dot(i.worldNormal, i.viewDir);
//invert the fresnel so the big values are on the outside
fresnel = saturate(1 - fresnel);
//raise the fresnel value to the exponents power to be able to adjust it
fresnel = pow(fresnel, _FresnelExponent);
//combine the fresnel value with a color
float3 fresnelColor = fresnel * _FresnelColor;
//apply the fresnel value to the emission
o.Emission = _Emission + fresnelColor;
}
ENDCG
}
FallBack "Standard"
}
Comment
Answer by ReinholdRunner · Oct 23, 2019 at 10:02 PM
Ok I fixed it... I wrote:
Tags{ "RenderType"="Transparent" "Queue"="Transparent"}
but it should be set to "Opaque"
Your answer
Follow this Question
Related Questions
Any way to get rid of squares (artifacts) in a semi transparent shadow of a fade shader? 0 Answers
How to add shadows to surface shader? 1 Answer
Shadow distance rendering in a custom shader 1 Answer
Shadow sprite rotation regardless of the light source 0 Answers
Shadows with Alpha, fade out shadow. 2 Answers