为什么说是“简易地模拟”呢?
因为,在两种介质确定了的情况下,这一章节中认为折射系数kt是一个常数,对应反射系数kr=1-kt。
但是,实际情况则是:kt会因入射角的不同而变化。
90.1 理论介绍
参考:
1,“问题二十四:怎么模拟ray tracing图形中介质材料的颜色(dielectric)”。
http://blog.csdn.net/libing_zeng/article/details/54428732
2,《Ray Tracing fromthe Ground Up》第27章。
怎么判断是否发生全反射?
“问题二十四”中的“式子8”中的那个根号下的内容是否小于0。
即:
90.2 光照模型(Illumination Model)
光线进入另一种介质后,光线和法向量的夹角发生了变化。而且,光线微分椎体的角度也同样发生了变化。这个角度的变化也是遵循Snell定律的。对应立体角的关系则是Snell公式的平方关系。所以:
90.3 最大深度(Maximum Depth)
最小深度:
对于考虑折射光线的情况下,光线的最小深度为2,因为光线进入另一种介质之后至少经过两次折射(反射)才能从该介质中出去。
最大深度:
如下是最大深度为4的光线传播示意图:
90.4 C++代码实现
首先,建立一个BTDF的父类。然后建立相关的子类。继承关系图如下:
PerfectTransmitter的主要代码如下:
透明材质Transparent的主要代码如下:
90.5 测试图形
测试相关代码:
输出图形:
90.5.1 折射率=1
将折射率设为1,可以先检查图形是否某些地方出错。
前边是Max depth=2;后边是Max depth=4。
90.5.2 折射率>1
折射率=1.2
前边是Max depth=2;后边是Max depth=4。
折射率=1.4
前边是Max depth=2;后边是Max depth=4。
折射率=1.6
前边是Max depth=2;后边是Max depth=4。
90.5.3 折射率<1
当折射率小于1时,则有可能发生全反射。现实场景:水中的气泡。
接下来的测试图形的Max depth都是等于4。
折射率=0.8
(玻璃球的外圈发生了全发射)
折射率=0.6
(透明球的外圈发生了全反射)
前边是Max depth=2;后边是Max depth=4。
90.6 其他说明
完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9785153
Referrance
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.