本文为大便一箩筐的原创内容,转载请注明出处,谢谢: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的更多相关文章

  1. 《The Cg Tutorial》阅读笔记——凹凸贴图 Bump Mapping

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/5018103.html 凹凸贴图 Bump Mapping 一.简介 凹凸贴图用于在不 ...

  2. exploit writing tutorial 阅读笔记总结

    近日阅读Corelan Team编写的exploit writing tutorial系列,大致了解了一下原理,记了一些笔记.此系列文章有中文翻译版,在看雪论坛上发表. 英文版地址:https://w ...

  3. "Becoming Functional" 阅读笔记+思维导图

    <Becoming Functional>是O'Reilly公司今年(2014)7月发布的一本薄薄的小册子,151页,介绍了函数式编程的基本概念.全书使用代码范例都是基于JVM的编程语言, ...

  4. 《The Cg Tutorial》阅读笔记——动画 Animation

    这段时间阅读了英文版的NVidia官方的<The Cg Tutorial>,借此来学习基本的图形学知识和着色器编程. 在此做一个阅读笔记. 本文为大便一箩筐的原创内容,转载请注明出处,谢谢 ...

  5. Hadoop阅读笔记(四)——一幅图看透MapReduce机制

    时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...

  6. <<Java并发编程的艺术>>-阅读笔记和思维导图

    最近在坚持每天阅读<>,不但做好笔记(MarkDown格式),还做好思维导图. 如果大家感兴趣,可以可以到码云上阅读笔记和到ProcessOn上阅读思维导图. 码云:https://git ...

  7. Spring源码阅读笔记01:源码阅读环境准备

    1. 写在前面 对于做Java开发的同学来说,Spring就像是一条绕不过去的路,但是大多数也只是停留在对Spring的简单使用层面上,对于其背后的原理所知不多也不愿深究,关于这个问题,我在平时的生活 ...

  8. [Tutorial]综述阅读笔记 <Visual Odometry PartII_Introduce about BA>

    目录 Visual Odometry: Part II - Matching, Robustness, and Applications ---- paper notes 特征点的选择与匹配 特征点匹 ...

  9. 阅读笔记 1 火球 UML大战需求分析

    伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本   <火球 UML大战需求分析>,首先 ...

随机推荐

  1. Hidden String---hdu5311(字符串处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5311 题意:从给出的串 s 中找到3个子串然后把他们连在一起问是否能够成anniversary #in ...

  2. Json反序列化Map的key不能是Object

    使用json作为数据传输格式,碰到一个问题.我希望传输的是一个Map<Target, TargetInfo>其中Target是一个对象,作为map的一个key public class T ...

  3. MariaDB备份和恢复

    一.为什么要备份? 灾难恢复:硬件故障.软件故障.自然灾害.黑客攻击.误操作: 测试二.要注意的要点: 能容忍最多丢失多少数据: 恢复数据需要多长时间内完成: 需要恢复哪些数据: (1)做还原测试,用 ...

  4. C#检测两个文件内容是否相同

    不知道为什么对Excel 2010 xlsx后缀的文件没有效果,求解! 对其他文件有效,如.txt,.csv using System; using System.Security.Cryptogra ...

  5. python16_day18【Django_Form表单、分页】

    一.表单 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 1.Form类 创建Form类时,主 ...

  6. go——通道(二)

    在Go语言里面,你不仅可以使用原子函数和互斥锁来保证对共享资源的安全访问以消除竞争状态, 还可以使用通道,通过发送和接收需要共享的资源,在goroutine之间做同步. 当一个资源需要在gorouti ...

  7. mysql的-F与master-data理解(一个小型的big-log恢复)

    例子: 使用mysqlbin-log恢复,有两种情况,一个是停数据库,一个是不停 在不停数据库的情况下,为了防止新的写入,需要将bin-log切割,然后新的数据会保存在新的bin-log里面 在此之前 ...

  8. 虚拟环境virtualenv和virtualenvwrapper(转)

    virtualenv是用来创建一个独立的Python虚拟环境的工具,通过virtualenv可以创建一个拥有独立的python版本和安装库的虚拟开发环境.这样一来我们就可以在虚拟环境中安装各种各种所需 ...

  9. java栈的实现

    可以采用数组与链表两种方法来实现栈. 1.用数组实现栈 import java.util.Arrays; public class MyStack<E>{ private Object[] ...

  10. WCF RIA SERVICE相关技术

    WCF RIA SERVICE实体属性拷贝 private void DoSubmit() { ((IEditableObject)this.RepairContract).EndEdit(); va ...