(转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .

摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”

材质和光的交互除了反射现象,对于透明物体还存在透射现象。模拟光的透射现象通常是一个比较头痛的问题,因为需要至少计算光的两次透射方向,首先计算光从介质一进入介质二的透射方向,然后计算光从介质二进入介质一的透射方象。此外,光在透明物体内穿越的距离以及被穿越的材质,直接关系到光的衰减程度;加上,还有很复杂的透明材质的次表面散射现象,即光线渗透到透明材质中,在内部发生散射,最后射出物体并进入视野中产生的现象。总而言之,不论在 CPU 上还是在 GPU 上,想要精确完善的模拟光透现象是一件相当复杂的事情。

我们常听说的光线跟踪算法,虽然可以跟踪模拟出光透现象,但是对于次表面散射的模拟无能为力,并且基于 CPU 的光线跟踪算法是无法达到实时要求的。基于 GPU 的光线跟踪算法已经得到实现,不过我并不打算在本书中进行阐述,而是转而讲解较为基础的简单透明光照模型,以及其基于 GPU 的实现方法。待读者掌握了这个基础实现后,我会在本套书的第二版中再阐述基于 GPU 的复杂光透模拟的相关算法。

在一个场景中,光滑的物体表面往往会映射出周围环境,想象一下,一款赛车游戏中,当你的车呼啸而过时,车身同时映射出周围的景色,流光飞扬。为了达到这样的效果,通常使用环境贴图技术。

本章中,首先给出与光透现象相关的两个重要光学定律: Snell 定律和 Fresnel 定律;然后阐述如何使用环境贴图方法模拟光滑表面对周围场景的映射效果,并给出 GPU 实现代码;最后讲解简单透明光照模型,并给出 GPU 实现代码。这些技术非常有用,在大家所玩的 3D 游戏中,为了在效率和效果上达到平衡,百分之百是采用这些技术或者这些技术的变体。

11.1 Snell 定律与 Fresnel 定律

11.1.1 折射率与 Snell 定律

光在真空中的速度 与在透明介质中的速度 之比,如公式( 11-1 )所示,称之为该介质的绝对折射率,简称折射率。光在真空中的折射率等于 1 ,通常我们认为光在空气中的折射率也近视为 1 。

折射率较大介质的称为光密介质,折射率较小的介质称为光疏介质。下面给出一些常用介质的折射率,如表所示。


材质


折射率值


真空 / 空气


1.0/ 1.0003



1.333


玻璃


1.5-1.7


钻石


2.417



1.309

表 9 常用介质折射率表

Snell 定律描述光线从一个介质传播到另一个介质时,入射角、折射角和介质折射率的关系。如图 28 所示,假设光线从空气射入水面,入射角度为 ,空气对光线的折射率为Ni ,折射率角度为 ,水对光线的折射率为Nt ,则存在:

通过 snell 定律,我们可以根据入射光的方向向量求取折射光的方向向量

需要注意:折射率和下面将要阐述的 fresnel 折射系数并不是同样的东西。折射率本质上反映的是光在介质中的运行速度,以及折射方向;而 fresnel 折射系数反映的是,光在透明介质表面被折射的光通量的比率。

11.1.2 色散

色散分为正常色散和反常色散,通常我们所说的色散都是指反常色散,即,对光波透明的介质,其折射率随着波长的增加而减小。1672 年,牛顿利用三棱镜将太阳光分解为光谱色带(红橙黄绿蓝靛紫),这是人类首次所做的色散试验。天空中的彩虹也是由于光与水蒸气交互形成的色散现象(图 29 所示)。法国数学家柯西在1936 年首先给出了正常色散的经验公式,称为柯西公式。

计算机中的颜色是三原色,即只有红、绿、蓝三种颜色,给出光的红、绿、蓝分量的不同折射系数,可以近似模拟色散效果。

11.1.3 Fresnel 定律

光线照射到透明物体上时,一部分发生反射,一部分进入物体内部并在介质交界处发生折射,被反射和折射的光通量存在一定的比率关系,这个比率关系可以通过 Fresnel 定律进行计算。

根据 Fresnel 定律计算得出的数据称为 Fresnel 系数。严格而言, fresnel 系数分为 fresnel 反射系数和 fresnel 折射系数,通常我们所说的 fresnel 系数指 “ 反射系数 ” 。例如,实时计算机图形学第二版 139 页中写到: fresnel 系数,如果 fresnel 为 0.7 ,那么被反射光线就减少奥 70% ,穿过表面的折射光线则是 30% 。下文中我们用 Kr表示 fresnel 反射系数,用Kt 表示 折射系数,如果不做详细说明,则通常所写的 fresnel 系数指反射系数。

一个完整的 fresnel 公式依赖于折射率、消光率和入射角度等因素,该公式的推导本质上是属于物理光学的部分,在《 3D 游戏与计算机图形学中的数学方法》一书的 117 页给出了 Fresnel 系数的简易推导方式,有兴趣的可以阅读。

schlick 给出了 Fresnel 反射系数的一个近似,精度在 1% 范围内:

Fo为入射角度接近 0 (入射方向靠近法向量)时的 Fresnel 反射系数, V是指向视点的观察方向, H为半角向量。 观察公式 ( 11-3 ) ,可以得出一个结论:随着入射角趋近 90 ,反射系数趋近 1 ,即擦地入射时,所有入射光都被反射。

在 fresnel equations-Wikepedia 中列举了当入射角度接近 0 时的 fresnel 反射系数的计算方法:

求出 fresnel 反射系数后,用 1 减去该系数,就得到了折射系数,所以 当入射角度接近 0 时的 fresnel 折射系数的计算方法为:

综合公式( 11-3 )和公式( 11-4 ), fresnel 反射系数的 计算公式为:

计算公式( 11-6 )比较消耗时间,所以通常在程序中使用入射角接近 0 时的 fresnel 系数。下面的公式( 11-7 )计算精度不高,但是胜在计算速度快,利于硬件实现,所以如果想动态的计算 fresnel 系数,而又不希望消耗太多的时间,可以采用公式( 11-7 )。

普通玻璃的反射系数大约是 4% 。

链接 http://www.cnblogs.com/guoyiqi/archive/2011/08/01/2137117.html

时间: 2024-10-17 16:55:47

(转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .的相关文章

ubuntu下搭建android开发环境(四)核心篇安装AndroidStudio、sdk、jdk(by 星空武哥)

转载请标注原创地址:http://blog.csdn.net/lsyz0021/article/details/52215996 所有的软件均在ubuntu 14.04 LTS下测试 ubuntu下搭建android开发环境(一)安装ubuntu系统 ubuntu下搭建android开发环境(二)设置ubuntu的root管理员密码 ubuntu下搭建android开发环境(三)ubuntu安装搜狗输入法 ubuntu下搭建android开发环境(四)核心篇安装AndroidStudio.sdk

OpenGL ES 光照模型之——环境光照(RenderMonkey测试)

概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用RenderMonkey创建一个简单的工程 2.环境关照模型分析及相应输入数据创建 3.Shader代码编写 4.效果展示 使用RenderMonkey创建一个简单的工程 RenderMoney创建一个OpenGL ES渲染工程很简单,大家只需根据下面图片步骤即可创建一个纯色的球体模型渲染工程. (

实现MySQL读写分离 部署集群基础环境(有图)

实现MySQL读写分离 部署集群基础环境 1 实现MySQL读写分离1.1 问题 本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离: 用户只需要访问MySQL代理服务器,而实际的SQL查询.写入操作交给后台的2台MySQL服务器来完成 其中Master服务器允许SQL查询.写入,Slave服务器只允许SQL查询 1.2 方案 使用4台RHEL 7.2虚拟机,如图-1所示.其中192.168.4.10.192.168.4.20分别作为MySQL主.从服务器,是整个服

GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建(十几篇)

一.简介 虽然GTK+是Linux下的开发环境,因为其跨平台特性,有时候需要在Windows上用到它的.如下是在Windows10下配置GTK+的开发环境.        Gnome的开发基础结构是围绕一组函数库的,所有的内容都是用可移植的ANSI C语言写成的,可以用于所有类UNIX系统,与图形相关的函数库依赖于X Window系统. Gnome函数库是最高层的.GTK+由两部分组成,GTK和GDK. GTK层为C语言提供了一个对象模型,并为UI工具包提供了最基本的widget,它是上层GUI

前端工程师技能之photoshop巧用(从效果图到雪碧图)4——优化篇

[新建]把需要的内容拖到新的文件里,或者复制粘贴到新的文件里.背景内容要选择透明 [补充]图片各种格式及特点 jpg:不支持透明半透明,所有空白区域填充白色(高清图) gif:支持透明,不支持半透明(小图标,支持动画) png8:支持透明,不支持半透明(小图标,不支持动画) png24:支持透明,也支持半透明(半透明的图片) [保存]:为保证图片质量,保留一份psd,在psd文件上进行修改.保存其他类型的图片时会对图片进行一定的压缩,如果不在psd上,而是在其他类型的图片上进行修改并保存,会导致

Spring思维导图(IOC篇)

写在前面 写过java的都知道:所有的对象都必须创建:或者说:使用对象之前必须先创建.而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象. 就好像我们无需考虑对象的销毁回收一样,因为java垃圾回收机制帮助我们实现了这个过程:而ioc则是让我们无需考虑对象的创建过程,由ioc容器帮我们实现对象的创建.注入等过程. Spring知识细节.png 控制反转 Spring ioc简介.png spring ioc容器 在Spring框架中的核心组件只有三个:Core.Conte

前端工程师技能之photoshop巧用(从效果图到雪碧图)2——测量篇

[需要测量的信息] [1]尺寸信息 -> 测量(矩形选框工具+信息面板)  [注意]测量时,画布放得尽可能大 [a]宽度.高度 [b]内边距.外边距 [c]边框 [d]定位 [e]文字大小 [f]行高 [g]背景图位置 [2]颜色信息 -> 取色(取色器) [a]边框色 [b]背景色 [c]文字色 [实战] [1]测量图片宽高 [1.1]测量普通图片宽高:先用矩形选框工具选择一个大的区域,然后再按住alt键,减去多余的部分 [1.2]测量超过1屏的大区域的宽高:先用矩形选框工具在最左边画一个小

每天学点切图技巧——PS篇

1.选框工具这里可以选择增加选区.减少选区 ==> 2.存储为web格式 1)JPG:一般用于大图 2)gif:可作动图,与png-8基本一样,不支持半透明 3)png-8:不支持动图,不支持半透明 4)png-24:只有这个,支持半透明 调整时可用ctrl加+放大查看 3.背景渐变的按钮,上头有文字,选中1px渐变条复制,按ctrl+T拉伸一下,将文字盖住 4.如果用选框选取四周都是参考线的选区,很有可能多选1px,解决方法是按住ctrl再去选,就能正好了 5.ctrl+alt+shift+E

Spark开发环境配置(windows/Intellij IDEA 篇)

Intellij IDEA是一个蛮不错的IDE,在java/scala/Groovy领域深得人心.笔者之前使用的是Eclipse那一套开发环境,虽然也不错,但忍不住好奇心的驱使,折腾了一下IDEA,发现写起Spark程序来,"哎呦,不错哟!",故总结一下在windows系统中的配置过程(在mac下的配置其实更简单一些),自己琢磨时还是费了点劲的,网上各种教程新旧正误繁杂,好不麻烦,加上笔者工作中最烦的就是各种软件的下载安装配置,有时一个配置没做对,就浪费好长时间.故而将自己摸索过程总结