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

本文主要是介绍透明光照模型与环境贴图之1:基础理论篇(折射率、色散、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%

 

这篇关于透明光照模型与环境贴图之1:基础理论篇(折射率、色散、fresnel定律)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/liu_lin_xm/article/details/4846200
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/181162

相关文章

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

SpringBoot实现多环境配置文件切换

《SpringBoot实现多环境配置文件切换》这篇文章主要为大家详细介绍了如何使用SpringBoot实现多环境配置文件切换功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 示例代码结构2. pom文件3. application文件4. application-dev文

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过