《The Cg Tutorial》阅读笔记——环境贴图 Environment Mapping
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4969956.html
环境贴图 Environment Mapping
一、简介
环境贴图是一种用于模拟高度反射物体表面反映周围环境的技术,使用环境贴图技术的前提条件是假定环境到物体的距离无限远。
由于环境贴图只关注方向而忽略了位置,因此它在平坦反射表面上的效果很不真实,相对的,它在曲面上可以取得较好的视觉效果。
二、立方贴图纹理 Cube Map Textures
1. 简介
立方贴图纹理由六张恰好构成一个立方体的正方形纹理图像组成,它们形成了一个全方位图像,使我们能够利用它们实现环境映射。

访问立方贴图纹理需要使用一个表示3D方向向量的三元纹理坐标。将这个纹理坐标看作一个从立方体中心发射的射线,它必然会与立方体六个面中的一个相交,而立方纹理贴图将会返回交点过滤后的色彩。
2. 生成立方贴图纹理
【方法一】
在坐标原点使用摄像机向XYZ轴正负方向各拍一张快照,摄像机的取景角度必须为90度,长宽比必须为1:1。
【方法二】
使用其他电脑软件生成或直接拍摄真实照片。
三、数学表达
1. 如何计算反射向量 Reflected Vector
R = I - 2 * N * (N · I)
- R为反射光方向的单位向量
- I为入射光方向的单位向量
- N为物体表面法线的单位向量

2. 如何计算折射向量 Refracted Vector
1) 折射(斯奈尔)定律 Snell's Law
η1sinθI = η2sinθT
- η1为入射光所在材质的折射率
- θI为入射光与折射表面法线的夹角
- η2为折射光所在材质的折射率
- θT为折射光与折射表面法线的夹角

2) 常见材质的折射率
|
材质 |
折射率 |
|
真空 Vacuum |
1.0 |
|
空气 Air |
1.0003 |
|
水 Water |
1.3333 |
|
玻璃 Glass |
1.5 |
|
塑料 Plastic |
1.5 |
|
钻石 Diamond |
2.417 |
|
注意 不同类型的玻璃有不同的折射率,1.5是普通窗户玻璃的折射率。它也是大部分塑料的近似折射率。 |
|
3) 计算折射光方向的数学公式
T = (cosT2 > 0 ? 1 : 0) * (RefractedRatio * I + (RefractedRatio * CosI - CosT) * N)
- RefractedRatio为入射光所在材质折射率与折射光所在材质折射率的比值
RefractedRatio = η1 / η2
- I为入射光的方向向量
- N为物体表面法线的方向向量
- CosI为入射光所在直线与物体表面法线所在直线的夹角余弦值
CosI = -I · N
- CosT2为折射光所在直线与物体表面法线所在直线的夹角余弦值的平方
CosT2 = 1 – RefractedRatio2 * (1 – CosI2)
- CosT为折射光所在直线与物体表面法线所在直线的夹角余弦值
CosT = sqrt(|cosT2|)

四、菲涅尔效应与色散
1. 菲涅尔效应 The Fresnel Effect
1) 定义
当光通过两种材质之间的界面时,部分发生反射,部分发生折射的现象被称为菲涅尔效应。
用于量化菲涅尔效应的菲涅尔方程(The Fresnel equations)是非常复杂的,因此,在使用程序模拟菲涅尔效应时通常采用经验近似方程,在得到良好模拟效果的同时能够显著减少副作用。
2) 菲涅尔方程的近似等式:
ReflectionCoefficient = max(0, min(1, Bias + Scale × (1 + I · N)Power))
CFinal = ReflectionCoefficient × CReflected + (1 – ReflectedCoefficient) × CRefracted
方程中隐藏的概念的是:当入射光方向的单位向量I与表面法线的单位向量N几乎重合(处于同一直线但方向相反)时,反射光强度几乎为0,大部分光线都被折射了;当I与N充分发散时,所有的光线都会被反射。
2. 色散 Chromatic Dispersion
1) 定义
折射不仅取决于表面法线N、入射光线I以及折射率RefractedRatio,还会受到入射光波长的影响,这种现象被称为色散。

2) 数学实现
在计算折射时,为RGB三个通道分别设置不同的折射率,其中蓝光折射率最高,绿光其次,红光最低。
《The Cg Tutorial》阅读笔记——环境贴图 Environment Mapping的更多相关文章
- 《The Cg Tutorial》阅读笔记——凹凸贴图 Bump Mapping
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/5018103.html 凹凸贴图 Bump Mapping 一.简介 凹凸贴图用于在不 ...
- exploit writing tutorial 阅读笔记总结
近日阅读Corelan Team编写的exploit writing tutorial系列,大致了解了一下原理,记了一些笔记.此系列文章有中文翻译版,在看雪论坛上发表. 英文版地址:https://w ...
- "Becoming Functional" 阅读笔记+思维导图
<Becoming Functional>是O'Reilly公司今年(2014)7月发布的一本薄薄的小册子,151页,介绍了函数式编程的基本概念.全书使用代码范例都是基于JVM的编程语言, ...
- 《The Cg Tutorial》阅读笔记——动画 Animation
这段时间阅读了英文版的NVidia官方的<The Cg Tutorial>,借此来学习基本的图形学知识和着色器编程. 在此做一个阅读笔记. 本文为大便一箩筐的原创内容,转载请注明出处,谢谢 ...
- Hadoop阅读笔记(四)——一幅图看透MapReduce机制
时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...
- <<Java并发编程的艺术>>-阅读笔记和思维导图
最近在坚持每天阅读<>,不但做好笔记(MarkDown格式),还做好思维导图. 如果大家感兴趣,可以可以到码云上阅读笔记和到ProcessOn上阅读思维导图. 码云:https://git ...
- Spring源码阅读笔记01:源码阅读环境准备
1. 写在前面 对于做Java开发的同学来说,Spring就像是一条绕不过去的路,但是大多数也只是停留在对Spring的简单使用层面上,对于其背后的原理所知不多也不愿深究,关于这个问题,我在平时的生活 ...
- [Tutorial]综述阅读笔记 <Visual Odometry PartII_Introduce about BA>
目录 Visual Odometry: Part II - Matching, Robustness, and Applications ---- paper notes 特征点的选择与匹配 特征点匹 ...
- 阅读笔记 1 火球 UML大战需求分析
伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本 <火球 UML大战需求分析>,首先 ...
随机推荐
- Redis2.8配置文件详解(转)
add by zhj : 没找到本文的原文.另外,redis配置文件中文翻译 也翻译的不错,可以与本文对照看.两篇文章都是以Redis2.8来介绍的 在Redis中直接启动redis-server服务 ...
- java 使用LinkedList模拟一个堆栈或者队列数据结构
近期在复习下java基础,看了下java基础,在看到集合时突然发现想起来曾经面试有一道笔试题:模拟一个堆栈或者队列数据结构,当时还没做出来,今天就写一下,首先得明确堆栈和队列的数据结构 堆栈:先进后出 ...
- Acheron一期SVN地址
svn://10.0.0.100/project/Acheron/2.0/SourceCode tailf 命令 http://web2py.com/books/default/chapter/29/ ...
- 010-JDK可视化监控工具-VisualVM
一.概述 VisualVM是一个集成多个JDK命令行工具的可视化工具.VisualVM基于NetBeans平台开发,它具备了插件扩展功能的特性,通过插件的扩展,可用于显示虚拟机进程及进程的配置和环境信 ...
- Redis三(List操作)
List操作 redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name,values) 1 2 3 4 5 6 7 8 # 在name对应的list中添加元 ...
- Visual Studio Code 配合 Node.js 轻松实现JS断点调试
一直喜欢vscode这个编辑器,今天看在liaoxuefeng.com学习nodejs时,看到上面 讲了使用vscode配合nodejs调试JS代码,原来这么简单,现在分享如下: 本人环境: Visu ...
- Ubuntu学习笔记1-基本部分
Vim相当于vi的升级版 Find p*.txt支持查找通配符 Echo 回显命令 echo hello >1.txt 追加命令,不覆盖 echo hello >1.txt 覆盖命 ...
- mysql监控报警工具
#!/usr/bin/env python # coding:utf-8 import MySQLdb import requests, json import time url = "ht ...
- 解决hash冲突的办法
1.开发定址法 2.再哈希法 3.链地址法 4.建立一个公共溢出区
- 第一课 C语言简明教程
1序言: 1与Java.C#等高级语言相比,C语言使用简单但是也非常重要更容易出错,到目前为止基本上操作系统的内核代码超过百分之九十使用C语言完成,因此学好C语言是学好计算机这门课程的基础,特别是进入 ...