Unity Shader菲涅耳反射(Fresnel)

来源:互联网 发布:windows程序设计 画圆 编辑:程序博客网 时间:2024/04/30 10:45


菲涅尔反射经常用于汽车表面的材质,普通的反射看上去比较粗略,菲涅尔的效果和镜面效果会让汽车表面看的更有质感,并且创建一种边缘光照的效果。


不是所有的表面都要相同数量的菲涅尔光照,想汽车表面的话需要高强度的菲涅尔反射,但是塑料材质的只需要迟钝点的强度就可以了。


下面我们看下效果:


我调出来的效果:



不知道是版本原因还是其他原因,书上的那种效果我没有调处来,我们看下书上调出来的效果:


感觉书上的这种更有质感,有知道方法的告知。


下面我们看下shader脚本:

Shader "MyShaders/FresnelReflections" {Properties{_MainTint("Diffuse Tint", Color) = (1,1,1,1)_MainTex("Base (RGB)", 2D) = "white" {}_Cubemap("Cubemap", CUBE) = ""{}_ReflectionAmount("Reflection Amount", Range(0,1)) = 1_RimPower("Fresnel Falloff", Range(0.1, 8)) = 2_SpecColor("Specular Color", Color) = (1,1,1,1)_SpecPower("Specular Power", Range(0,1)) = 0.5}SubShader{Tags{ "RenderType" = "Opaque" }LOD 200CGPROGRAM#pragma surface surf BlinnPhong#pragma target 3.0samplerCUBE _Cubemap;sampler2D _MainTex;float4 _MainTint;float _ReflectionAmount;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);float rim = 1 - saturate(dot(o.Normal, normalize(IN.viewDir)));rim = pow(rim, _RimPower);o.Albedo = c.rgb * _MainTint.rgb;o.Emission = (texCUBE(_Cubemap, IN.worldRefl).rgb * _ReflectionAmount) * rim;o.Specular = _SpecPower;o.Gloss = 1.0;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"}

下载资源



0 0
原创粉丝点击