菲涅尔反射(Fresnel Reflection)

离线渲染中,通常可以用kd,ks,kt(分别代表物体的漫反射系数,镜面反射系数,透射系数)来简单地描述一个物体的基本材质,例如,我们将一个物体设置为:kd=0,ks=0.1,kt=0.9,即代表一束光击中该物体表面后,其中的90%发生透射(折射),另外10%被表面反射回来。这代表了无论光线以何种角度击中物体表面,它的反射率和透射率都是一样的。但是实际生活中是否是这样的呢?

试想,你站在湖边,低头看脚下的水,你会发现水是透明的,反射不是特别强烈;如果你看远处的湖面,你会发现水并不是透明的,反射非常强烈。简单的讲,就是视线垂直于表面时,反射较弱,而当视线非垂直表面时,夹角越小,反射越明显。如果你看向一个圆球,那圆球中心的反射较弱,靠近边缘较强,这就是“菲涅尔效应”。不同材质的菲涅尔效应强弱不同,导体(如金属)的菲涅尔反射效应很弱,就拿铝来说,其反射率在所有角度下几乎都保持在86%以上,随角度变化很小,而绝缘体材质的菲涅尔效应就很明显,比如折射率为1.5的玻璃,在表面法向量方向的反射率仅为4%,但当视线与表面法向量夹角很大的时候,反射率可以接近100%,这一现象也使得金属与非金属看起来不同。

在图形学中,我们也可以加入菲涅尔反射效应,以使玻璃,瓷器,水面等物体的反射显得更真实。菲涅尔反射的方程可以由麦克斯韦电磁学方程推导出来(因为本质上讲菲涅尔反射就是用波动的理论来解释光的反射)。对于透明物体而言其结果为:

公式中的kr与kt分别代表了最终求得的反射率与折射率,η代表了该物体的相对折射率,θi和θt分别代表了入射角与折射角。可以看出对于透明物体而言,有多少光能被折射是跟物体的相对折射率以及入射角度都是相关的,值得注意的一点是,当发生全反射的时候这个公式并不适用。

除此之外,菲涅尔反射效应也是可以用于漫反射等其他非透明材质之上的,用来描述其在各个入射角方向上的反射率,不过这种情况略微复杂一些,通常难以直接求解,但是它却可以用有理多项式来逼近,比如在处理次表面散射(Subsurface scattering)的时候会加入Fresnel项:

不过,我在代码中加入了针对透明物体的菲涅尔反射,并对同一个场景做了测试,发现貌似区别并不明显(晕+_+)。

未加入菲涅尔反射:

加入菲涅尔反射:

时间: 2024-10-20 19:14:37

菲涅尔反射(Fresnel Reflection)的相关文章

Fresnel Reflection - 菲涅尔反射

[Fresnel Reflection - 菲涅尔反射] “菲涅尔”是一个人的名字,因为他发现了一个有关反射的光学现象,这个现象就用这个人的名字命名了.那么,是什么现象呢? 这就是反射/折射与视点角度之间的关系. 如果你站在湖边,低头看脚下的水,你会发现水是透明的,反射不是特别强烈:如果你看远处的湖面,你会发现水并不是透明的,但反射非常强烈.这就是“菲涅尔效应”. 简单的讲,就是视线垂直于表面时,反射较弱,而当视线非垂直表面时,夹角越小,反射越明显.如果你看向一个圆球,那圆球中心的反射较弱,靠近

Fresnel Reflection

[Fresnel Reflection] One of the most used types of reflections is the Fresnel reflection. One of the most used surfaces of this type of effect is the body of a car. Fresnel Reflection有点像RimLight.在Shader实现上,也是借鉴了RimLight的算法来扰动Emission颜色. 为了实现Shader,我们

VRay材质基础(一)

一.漫反射 漫反射:是投射在粗糙表面上的光向各个方向反射的现象.更深入一点来讲,光线穿过物体表面,进入物体内部,经过一系列反弹后又穿出来. 次表面散射(英语:Subsurface scattering,简称"SSS"),比如:皮肤.蜡烛.玉石等. 二.金属 光线投射到金属表面后,一部分被反射,一部分被金属吸收.可以认为金属材质没有漫反射颜色,即金属材质的漫反射为纯黑,或者漫反射很暗. 制作金属材质时,主要调节反射颜色,开启Fresnel Reflection,Fresnel IOR 2

Unity3D ShaderLab 立方体图的菲涅尔反射

Unity3D ShaderLab 立方体图的菲涅尔反射 菲涅尔反射是反射类型中比较常见的一种类型,当我们的视线正对物体表面,那么反射量会明显增加, 我们几乎可以在任何支持反射类型的物体表面看到这种情况,我们接下来就来实现这种反射效果过. 还是先创建Shader和 Material,沿用上一节的立方体图.代码变动较少,直接看下面的完成代码: code start -------------------------------------------------------------------

Unity Shaders and Effects Cookbook (4-5)Cubemap与菲涅尔反射

菲涅尔是人名,他发现,当我们站在水中,直直的往下看水面,是看不到反射的太阳光的.而当我们往远处看时,就能看到很强的反光,也就是成语波光粼粼所体现的.这一现象就被命名为 菲涅尔反射. 刚看这一节的时候觉得莫名其妙,感情书上一开始写的有问题,书上是这么写的: 当你的视线对着物体表面的时候,反射量会明显增加. 我对这句话的理解是 正对着表面的时候,反射量会增加.--真是误导. 不过好在代码是不会骗我的. 代码实现的效果是符合菲涅尔反射的,正对着物体表面,反射量减少. 转自http://blog.csd

C#反射Reflection

反射就是动态获取程序集中的元数据,直接通过.dll来创建对象,调用成员. Type是反射一个重要的类.通过Type获取类中所有信息,包括方法,属性等. 一.Type的简单使用 1.通过typeof(类型名)或类实例.GetType()的方式获取某个类型的Type. 2.通过GetFields方法可以获取类型中的所有属性. 3.Activator.CreateInstance(类型的Type)可以创建类型的实例. 4.IsInstanceOfType(),判断是否是某一类型的的实例. 5.IsAs

Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataPro

1.错误描写叙述 信息: MLog clients using java 1.4+ standard logging. 2014-7-12 19:29:20 com.mchange.v2.c3p0.C3P0Registry banner 信息: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10] 2014-7-12 19:29:21 org.springframework.w

Fresnel效果和颜色色散(Using OpenGL & Cg)

1.Fresnel效果 一般来说,当光到达2种材质的接触面时,一些光在接触面的表面被反射出去,而另一部分光将发生折射穿过接触面,这个现象称为Fresnel效果.Fresnel公式描述了多少光被反射和多少光被折射.下面是Fresnel公式的一个近似: reflectionCoefficient=max(0,min(1,bias+scale×(1+I·N)power)) 反射系数reflectionCoefficient的范围被限制在[0,1]之间,我们根据下面的公式使用reflectionCoef

参数计数不匹配,未处理System.Reflection.TargetParameterCountException

系统出现异常:参数计数不匹配,未处理System.Reflection.TargetParameterCountException, 系统会显示如下的异常信息,但异常信息往往与实际异常位置差十万八千量: 未处理 System.Reflection.TargetParameterCountException Message=参数计数不匹配. Source=mscorlib StackTrace: 在 System.Reflection.RuntimeMethodInfo.Invoke(Object