(转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .
材质和光的交互除了反射现象,对于透明物体还存在透射现象。模拟光的透射现象通常是一个比较头痛的问题,因为需要至少计算光的两次透射方向,首先计算光从介质一进入介质二的透射方向,然后计算光从介质二进入介质一的透射方象。此外,光在透明物体内穿越的距离以及被穿越的材质,直接关系到光的衰减程度;加上,还有很复杂的透明材质的次表面散射现象,即光线渗透到透明材质中,在内部发生散射,最后射出物体并进入视野中产生的现象。总而言之,不论在 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% 。
(转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .的更多相关文章
- Shader中贴图知识汇总: 漫反射贴图、凹凸贴图、高光贴图、 AO贴图、环境贴图、 光照纹理及细节贴图
原文过于冗余,精读后做了部分简化与测试实践,原文地址:http://www.j2megame.com/html/xwzx/ty/2571.html http://www.cnblogs.com/z ...
- 《The Cg Tutorial》阅读笔记——环境贴图 Environment Mapping
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4969956.html 环境贴图 Environment Mapping 一.简介 环 ...
- OpenGL ES 光照模型之——环境光照(RenderMonkey测试)
概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...
- 利用opencv作透明重叠人群密度热度图
在作热度图的时候我们经常需要将热度图调整透明度后叠加在原图上达到更好的展示效果.比如检测人气密度的热度图: (来自sensetime) 一般作图的时候会第一时间想到matplotlib,因为可以很方便 ...
- springmvc 环境配置图
- STM32F0308开发环境的选择--CooCox CoIDE篇
STM32的开发环境有很多总,官方手册也提供了IAR Embedded Workbench.MDK-ARM和TrueSTUDIO这3种.今天我试用了CooCox CoIDE,是免费的集成开发环境,同T ...
- GTK+浅谈之一Windows10下QtCreator中GTK+环境搭建(十几篇)
一.简介 虽然GTK+是Linux下的开发环境,因为其跨平台特性,有时候需要在Windows上用到它的.如下是在Windows10下配置GTK+的开发环境. Gnome的开发基础结构是围 ...
- 【朝夕Net社区技术专刊】Core3.1 WebApi集群实战专题---WebApi环境搭建运行发布部署篇
欢迎大家阅读<朝夕Net社区技术专刊>第1期 原文是我在知乎发表的,现在在这里分享! 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为首 ...
- 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01
百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...
随机推荐
- 从weblogic的一个教训
部署后一定要检查解压后的文件是否修改了.常常出现部署中存在缓存的情况. weblogic8.1可能出现没有删除缓存情况.血的教训.
- 14.Iterator 和 for...of 循环
Iterator 和 for...of 循环 Iterator 和 for...of 循环 Iterator(遍历器)的概念 JavaScript 原有的表示"集合"的数据结构,主 ...
- 线程8--GCD常见用法
1.延迟执行 /***********************延迟第一种方法**************************/ /* 第一种方法, 调用NSObject的方法 [self perf ...
- Java基础教程(19)--Object类
Object类位于类结构树的最顶端,所有的类都是它的直接或间接子类,因此所有的类都继承了Object类的方法,我们可以在需要的时候覆盖这些方法.下面是一些将会在本文中讨论的Object类的方法: ...
- Java基础教程(14)--嵌套类
Java允许在一个类中定义另外一个类,这样的类被称为嵌套类,就像下面这样: class OuterClass { ... class NestedClass { ... } } 嵌套类分为两种 ...
- (mysql)找不到请求的 .Net Framework Data Provider。可能没有安装
webconfig配置以下节点(注意版本号) <system.data> <DbProviderFactories> <add name="MySQL Data ...
- Spring boot 入门四:spring boot 整合mybatis 实现CRUD操作
开发环境延续上一节的开发环境这里不再做介绍 添加mybatis依赖 <dependency> <groupId>org.mybatis.spring.boot</grou ...
- Python写随机发红包的原理流程
首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机浮点数通过下面的图简单看下: ...
- DW如何打开已经关闭的站点文件提示框
DW在已经新建成功站点后,若将站点文件提示框关闭后,如何重新打开呢?即如下图所示的提示框: 点击站点下拉菜单中的‘在站点定位’即可打开关闭的提示框.
- 基于jQuery的软键盘
基于jQuery的软键盘 前些天写了一个基于基于jQuery的数字键盘,今天给大家带来一个基于jQuery的全字母键盘插件(支持全字母大小写切换,数字输入,退格清除,关闭功能,可调整大小和键盘位置 ...