Unity Shader菲涅耳反射(Fresnel)

Posted 御雪妃舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shader菲涅耳反射(Fresnel)相关的知识,希望对你有一定的参考价值。


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


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


下面我们看下效果:


我调出来的效果:



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


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


下面我们看下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 200

		CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0

		samplerCUBE _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"

下载资源



以上是关于Unity Shader菲涅耳反射(Fresnel)的主要内容,如果未能解决你的问题,请参考以下文章

unity灯光和自发光的哪个节省内存

Unity Shader

菲涅尔效应(Fresnel Effect)

3Dmax中 VR材质 啥时候开启菲涅耳反射

在VR渲染器中啥情况下要打开菲涅尔反射

在VR渲染器中啥情况下要打开菲涅尔反射