(转)透明光照模型与环境贴图之基础理论篇(折射率、色散、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)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...
随机推荐
- java面试③Web部分
2.2.1 讲一下http get和post请求的区别 get和post请求都是http的请求方式,用户通过不同的http请求方式完成对资源(url)的不同操作,具体点来讲get一般用于获取/查询资源 ...
- weblogic:local class incompatible: stream classdesc serialVersionUID
问题:jdk版本不兼容 方法:修改weblogic对应的jdk版本
- can/socket can
1. 概念 参考:Linux-CAN编程详解 can引脚: cn2: 15:CAN1_H 19 CAN1_L 根据每组报文开头的 11 位标识符(扩展帧为29位标识符.CAN 2.0A 规范)解释数据 ...
- Ionic3 UI组件之 ImageViewer
组件特性: 轻触图片可全屏查看 手势上下滑动可关闭全屏查看 点击导航箭头可关闭视图 双击查看全图,并可放大 参考地址:https://github.com/Riron/ionic-img-viewer ...
- Jsp&Servlet入门级项目全程实录第3讲
惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 1.建立数据表及数据(略) 2.装载驱动,建立数据表 <link rel="stylesheet&qu ...
- eclipse配置tomcat Mac平台
1.到 apache官方主页 http://tomcat.apache.org 下载 Mac 版本的完整 tar.gz文件包.解压拷贝到 /Library 目录下,并命名为Tomcat,其他目录也可以 ...
- java获得Tomcat服务器的根目录下的内容
File f2=new File(System.getProperty("catalina.home")+ File.separator+"webapps"+F ...
- POJ 1061 青蛙的约会 扩展欧几里德--解不定方程
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 81606 Accepted: 14116 Descripti ...
- ibatis中$和#的区别
比如当变量name的类型是Stirng时, $name$ 打印出来的是 张三 #name# 打印出来的是 ‘张三’ $ 的作用实际上是字符串拼接 #用于变量替换 那什么时候用$,什么时候 用 # (1 ...
- java 正则表达式(内附例子)
前言:最近工作中遇到了大量用正则表达式的情况,需要用一定的规则匹配字符串,然后提取里面的数据,格式化后转成自己想要的格式.所以作为一个菜鸟是时候再来巩固一下正则表达式了.转载请注明出处:https:/ ...