angi
December 14, 2010, 2:47pm
1
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!
angi
December 14, 2010, 4:41pm
3
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); </p>
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"
}
Luismi
March 17, 2011, 11:45am
4
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!!
I can’t believe this isn’t stock. Everything has fresnel in the real world.
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"
}
here it is
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"
}