Q90:简易地模拟透明材质(Simple Transparency)

198 篇文章 12 订阅
195 篇文章 27 订阅

 

为什么说是“简易地模拟”呢?

因为,在两种介质确定了的情况下,这一章节中认为折射系数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.


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值