Unity3D ShaderLab 立方體圖的菲涅爾反射

Unity3D ShaderLab 立方體圖的菲涅爾反射函數

 

菲涅爾反射是反射類型中比較常見的一種類型,當咱們的視線正對物體表面,那麼反射量會明顯增長,spa

咱們幾乎能夠在任何支持反射類型的物體表面看到這種狀況,咱們接下來就來實現這種反射效果過。code

仍是先建立Shader和 Material,沿用上一節的立方體圖。代碼變更較少,直接看下面的完成代碼:orm

code start --------------------------------------------------------------------------blog

Shader "91YGame/FresnelReflection" {

Properties {

_MainTint("Diffuse Tint",Color)=(1,1,1,1)

_MainTex ("Base (RGB)", 2D) = "white" {}

_CubeMap("CubeMap",CUBE)=""{}

_ReflAmount("Reflection Amount",Range(0.1,3))=0.5

_RimPower("Fresnel Falloff",Range(0.1,3))=1

//反射顏色;

_SpecColor("Specular Color",Color)=(1,1,1,1)

//反射強度值;

_SpecPower("Specular Power",Range(0.02,1))=0.5

}

SubShader {

Tags { "RenderType"="Opaque" }

LOD 200

 

CGPROGRAM

//使用unity內置的BlinnPhong光照模型;

#pragma surface surf BlinnPhong

//使用Shader Mode 3.0;

#pragma target 3.0

 

sampler2D _MainTex;

samplerCUBE _CubeMap;

float4 _MainTint;

float _ReflAmount;

float _RimPower;

float _SpecPower;

 

struct Input {

float2 uv_MainTex;

float3 worldRefl;

float3 viewDir;

};

 

void surf (Input IN, inout SurfaceOutput o) {

half4 c = tex2D (_MainTex, IN.uv_MainTex);

 //反轉saturate函數得到的0-1之間的值;

float rim = 1.0 - saturate(dot(o.Normal,normalize(IN.viewDir)));

rim = pow(rim,_RimPower);

 //計算反射率;

o.Albedo = c.rgb*_MainTint.rgb;

//計算自發光並賦值;

o.Emission = (texCUBE(_CubeMap,IN.worldRefl).rgb*_ReflAmount)*rim;

//鏡面賦值;

o.Specular = _SpecPower;

//光澤度賦值;

o.Gloss = 1;

o.Alpha = c.a;

}

ENDCG

} 

FallBack "Diffuse"

}

 

 

code end -----------------------------------------------------------------------------get

最終返回unity,查看效果以下。依然是左側是咱們最新的菲涅爾反射效果:it

 

 

在上面的實現過程當中介紹的比較詳細,咱們簡單的經過一個衰減值,使它來對錶面反射量過多或過少的進行調整,經過將視線方向與表面法線相比較,io

咱們能夠計算相機朝向的衰減值。而後咱們反轉該值來實現一個簡單的遮罩效果,這樣物體表面的邊緣會變得更白,而相機方向的表面也就更黑了。class

相關文章
相關標籤/搜索