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

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

  1. 学习笔记-《GPU 编程与CG 语言之阳春白雪下里巴人》

    第一章 绪论 1.1 Programmable Graphics Processing Unit 发展历程 Programmable Graphics Processing Unit( GPU),即可 ...

  2. 计算机图形学绘制多边形代码_《GPU编程与CG语言之阳春白雪下里巴人》- 第二章(GPU 图形绘制管线)...

    第二章 GPU 图形绘制管线 万事开头难,每门科学都是如此. ------ 马克思 图形绘制管线描述 GPU 渲染流程,即"给定视点.三维物体.光源.照明模式,和纹理等元素,如何绘制一幅二维 ...

  3. GPU编程与CG语言之阳春白雪下里巴人 读书笔记

    CHPT2 GPU图形绘制管线 本章作者对GPU图形渲染管线做了深入浅出的总结概括. 所谓渲染管线即图形是如何从三维空间变换到我们二维的屏幕上的.具体的过程可以分为如下几步: 几何阶段   主要工作是 ...

  4. GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之一)。

    1.abs(x) 取得输入参数的绝对值. 2.acos(x) 反余切函数,为cos(x)的反函数,原来得到Y作为输入,的到对应的角度. (其实只要记得作用是:得到角度,值域为[0,π],输入范围为[- ...

  5. 【GPU编程】开始Cg之旅,编译自己的第一个Cg程序

    Cg(C for Graphcis)语言,是NVIDIA 与Microsoft 合作研发,旨在为开发人员提供一套方便.跨平台(良好的兼容性),控制可编程图形硬件的高级语言.Cg 语言的语法结构与C 语 ...

  6. Linux MD5 programming in C Language

    Linux MD5 programming in C Language MD5(Message Digest, Unoffical Homepage,  Wikipedia, rfc1321) 是 R ...

  7. C++ Primer - 5th Edition - 书中源代码 - 课后习题答案

    C++ Primer - 5th Edition - 书中源代码 - 课后习题答案 C++ Primer - 5th Edition - 书中源代码 - 课后习题答案 1. C++ Primer, 5 ...

  8. c++primer plus 第13章 编程题第2题

    c++primer plus 第13章 编程题第2题 #pragma once #ifndef CD_H_ #define CD_H_ //base classclass Cd { private:c ...

  9. c++primer plus 第11章 编程题第7题

    c++primer plus 第11章 编程题第7题 #pragma once #ifndef COMPLEX0_H_ #define COMPLEX0_H_ #include<iostream ...

  10. float gpu 加速_(总结篇)使用 MATLAB GPU 加速计算|MATLAB 并行计算与分布式服务器|MATLAB技术论坛...

    本帖最后由 蓝云风翼 于 2013-12-18 17:28 编辑 注: 利用gpu加速有一下工具 1.JACKET 可从帖子中寻找 2.MATLAB a.并行计算工具箱 gpuArray,查看支持gp ...

最新文章

  1. java 遍历方法_Java ArrayList遍历的3种方法
  2. MYSQL专题-MySQL三大日志binlog、redo log和undo log
  3. 内存泄漏代码_调查内存泄漏第1部分–编写泄漏代码
  4. layui 开启关闭标签_欧盟发布照明产品ErP及能效标签法规新草案
  5. Deploy Oracle 10.2.0.5 DataGuard on Red Hat Enterprise Linux 6.4
  6. [小心][注意][请转发]请检查你环境中的SSD磁盘!
  7. 读书笔记(chapter18)
  8. asp.net ajax updatepanel中textbox 乱码问题 解决方案
  9. 一看就懂的字符串匹配算法 之 BF算法(暴力匹配)
  10. lammps后处理:ovito快速提取单条位错线的伯氏矢量
  11. 使用PHP实现网易云音乐数据的获取
  12. 事件同时发生的相对性——思想实验推导狭义相对论(三)
  13. 英语中与数字有关的表达方式
  14. oracle18c静默安装教程,Oracle 18c 19c 安装的 DBT-50000 错误解决
  15. 【Cesium】加载互联网地图服务——高德地图
  16. 机器学习_深度学习毕设题目汇总——场景
  17. STM32—LED单灯闪烁之软件延时
  18. 数据结构之ElemType
  19. 操作系统中的进程间相互作用
  20. 求出 2 到 n 之间 (含 n)的所有素数。

热门文章

  1. android(微博 微信 qq) 分享和第三分认证登录的封装
  2. 毕业设计之甘特图制作
  3. tablayou设置固定下划线和根据文字显示长短显示下划线
  4. Android之使用通知栏通知的三种方法(短内容、长内容、图片通知)
  5. 面向对象与面向过程(尚学堂视频学习总结_001)
  6. 威廉玛丽学院计算机专业好吗,威廉玛丽学院计算机专业怎么样?
  7. echarts图表x轴文字过多时换行显示以及图表画区域背景颜色
  8. 面试小纸条(MySQL第一弹)
  9. 拔河比赛matlab编程,拔河比赛.doc
  10. 钢琴的音色特点用matlab描述6,关于用MATLAB 实现简易钢琴 App的教程分享