- Home /
fresnel/rim reflective shader
Hi there!
I've got a simple reflective shader (thanks to skovacs1):
Shader "Example/WorldRefl" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_Cube ("Cubemap", CUBE) = "" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
float3 worldRefl;
};
sampler2D _MainTex;
samplerCUBE _Cube;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb * 0.5;
o.Emission = texCUBE (_Cube, IN.worldRefl).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
Now I need to add a fresnel/rim filter to reduce the strength of reflection on the edges( depending on view direction). Can anyone help?
Thanks!
Answer by angi · Dec 14, 2010 at 04:41 PM
got it!
// FRESNEL CALCS float fcbias = 0.20373;
float facing = saturate(1.0 - max(dot( normalize(IN.viewDir.xyz), normalize(o.Normal)), 0.0));
float refl2Refr = max(fcbias + (1.0-fcbias) * pow(facing, _FresnelPower), 0);
Answer by skovacs1 · Dec 14, 2010 at 03:35 PM
Rim shaders aren't that difficult. For a simple Rim shader, you can look at the example here. All you would need to do is apply your rim function to your reflection if that's all that you want to be affected by the rim. Since you want the rim to soften the reflection on the edges, you would use the inverse (so remove the 1.0 - from the front of the equation in the linked example. This works well for rim alpha as well.
Shader "Example/RimWorldRefl" { Properties { _MainTex ("Texture", 2D) = "white" {} _Cube ("Cubemap", CUBE) = "" {} _RimPower ("Rim Power", Range(0.5,8.0)) = 3.0
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
float3 worldRefl;
float3 viewDir;
};
sampler2D _MainTex;
samplerCUBE _Cube;
float _RimPower;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb * 0.5;
half rim = saturate(dot (normalize(IN.viewDir), o.Normal));
o.Emission = texCUBE (_Cube, IN.worldRefl).rgb * pow(rim,_RimPower);
}
ENDCG
}
Fallback "Diffuse"
}
thanks, I tried this one. unfortunately it's not what I'm looking for... I think I need a fresnel so that reflections decrease depending on view angle.
This will decrease reflections depending on view angle and should do so on the edges as you ask. Perhaps if you'd have been a bit more specific. You don't indicate how far you want it to decrease to or what sort of ramp you want it to use. If you want a different rim equation, you would only need to adjust the one posted, but the answer does what you ask even if you didn't ask for what you wanted.
Answer by Luismi · Mar 17, 2011 at 11:45 AM
Hi,
artist here :) can you tell me where exactly should I put those lines? Rim Lighting shader works pretty well but I would like to give a little push to the fresnel effect.
Thanks a lot if advance!
cheers!!
Do not post comments in repsonse to an answer in the answer box. Use the comment box provided!
Answer by Metzger · Jan 13, 2013 at 01:01 AM
I can't believe this isn't stock. Everything has fresnel in the real world.
Answer by dongiorgi · Dec 20, 2013 at 02:10 PM
Shader "Gios's Shaders/Defuse Bump frisnel" { Properties{ _MainTex("Diffuse Texture" , 2D) = "white"{} _BumpTex("Normal Map" , 2D) = "bump"{} _RimColor("Rim Color" , Color) = (1,1,1,1) _RimPower("Rim Power" , Range(0.1,10)) = 3
}
SubShader {
Tags {"Rendertype" = "Opaque"}
CGPROGRAM
#pragma surface surf Lambert
struct Input{
float2 uv_MainTex;
float3 viewDir;
};
sampler2D _MainTex;
sampler2D _BumpTex;
float4 _RimColor;
float _RimPower;
void surf(Input IN,inout SurfaceOutput o){
fixed4 tex = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = tex.rgb;
o.Normal = UnpackNormal (tex2D (_BumpTex, IN.uv_MainTex));
half rim = 1 - saturate(dot(normalize(IN.viewDir), o.Normal));
o.Emission = _RimColor.rgb * pow(rim, _RimPower);
}
ENDCG
}
Fallback "Diffuse"
}