在“Q90”中,我们认为折射系数kt是一个常数,对应反射系数kr=1-kt。但是,实际情况则是:kt会因入射角的不同而变化。

这一章节,我们将真实地模拟透明材质。主要考虑两个问题:1,kt因入射角的不同而变化;2,透明材质对颜色的过滤

91.1 菲涅尔方程(The Fresnel Equations)

菲涅尔方程详细描述了“kt因入射角的不同而变化”的规律(注意,“菲涅尔方程”针对的是镜面反射和镜面折射)。

91.2 颜色过滤(Color Filtering)

当光线在介质中传播时,由于光线和介质中的分子相互作用,随着传播距离的增长,导致光线发生散射。如果这种散射和光线的波长相关,则介质会呈现相应的颜色。

当光线在介质中传播时,如下图:

光线在介质中的传播距离怎么求呢?

当光线进入介质时,即在撞击点处产生折射光线,我们要求的则是该折射光线在介质中的传播距离。这条折射光线撞击到物体的最小距离即为该光线在介质中传播的距离(如上图中的t1)。

当折射光线从介质内部撞击介质界面时,一方面会产生折射光线离开介质,另一方面则会产生反射光线。对于新产生的反射光线将继续在介质中传播,将继续衰减,这个传播距离怎么求呢?新的反射光线撞击到物体的最小距离即为该光线在介质中传播的距离(如上图中的r)。

91.3 C++代码实现

定义介质类“Dielectric”

由上方类的定义,可以看出介质类对应着“菲涅尔反射模型”、“菲涅尔折射模型”,所以,接下来,我们需要定义这两个“模型”的类。

“菲涅尔反射模型”

主要代码如下:

“菲涅尔折射模型”

主要代码如下:

在定义好介质类及其对应的反射/折射模型,我们现在看看介质类的着色函数(Dielectric::shade())

Whitted::trace_ray()做一点点修改:

91.4 测试图形

相关测试代码:

输出图形:

91.4.1 对比测试Realistic Transparency图形、Simple Transparency图形

dielectric_ptr->set_eta_in(1.6);

dielectric_ptr->set_eta_out(1.0);

dielectric_ptr->set_cf_in(1.0,1.0, 1.0);

dielectric_ptr->set_cf_out(1.0,1.0, 1.0);

前边的是当前Realistic Transparency图形;后边的是之前Simple Transparency图形

  

(两张图形的差别貌似不明显,主要差异:参考Figure28.1,当入射角大于50度时,kr、kt会发生剧烈变化,而不是Simple Tranparency中那样还是保持常数。这个变化表现在介质球的轮廓附近的位置。)

dielectric_ptr->set_eta_in(0.6);

dielectric_ptr->set_eta_out(1.0);

dielectric_ptr->set_cf_in(1.0,1.0, 1.0);

dielectric_ptr->set_cf_out(1.0,1.0, 1.0);

前边的是当前Realistic Transparency图形;后边的是之前Simple Transparency图形

  

(两张图形的差别貌似不明显,主要差异:参考Figure28.2,当入射角大于30度小于41.8度时,kr、kt会发生剧烈变化,而不是Simple Tranparency中那样还是保持常数。这个变化表现在介质球刚好发射全反射时的附近位置。)

91.4.2 对比测试介质内外过滤颜色的图形

前边的是介质内部过滤颜色的图形;

dielectric_ptr->set_eta_in(1.6);

dielectric_ptr->set_eta_out(1.0);

dielectric_ptr->set_cf_in(1.0,1.0, 0.0);

dielectric_ptr->set_cf_out(1.0,1.0, 1.0);

后边的是介质外部过滤颜色的图形

dielectric_ptr->set_eta_in(1.6);

dielectric_ptr->set_eta_out(1.0);

dielectric_ptr->set_cf_in(1.0,1.0, 1.0);

dielectric_ptr->set_cf_out(1.0,1.0, 0.0);

  

但从这组测试来看:介质内部过滤颜色作用的是折射光线,介质外部过滤颜色作用的是反射光线。有折射光线是一定有反射光线;但是当入射角接近90度时,则接近镜面反射(只有反射光线没有折射光线)。这样一来,整体的反射光线则比折射光线多,所以介质外部过滤颜色作用的光线比介质内部过滤颜色作用的光线要多。“多的位置”即是“入射角接近90度的位置”(介质球轮廓位置)。所以,介质外部过滤颜色作用的介质球的轮廓要比介质内部过滤颜色作用的介质球的轮廓有更多的“黄色”。

前面这组测试图形“多的位置”并不明显,接下来,我们看看一组包含全反射的测试图形。

前边的是介质内部过滤颜色的图形;

dielectric_ptr->set_eta_in(0.6);

dielectric_ptr->set_eta_out(1.0);

dielectric_ptr->set_cf_in(1.0,1.0, 0.0);

dielectric_ptr->set_cf_out(1.0,1.0, 1.0);

后边的是介质外部过滤颜色的图形

dielectric_ptr->set_eta_in(0.6);

dielectric_ptr->set_eta_out(1.0);

dielectric_ptr->set_cf_in(1.0,1.0, 1.0);

dielectric_ptr->set_cf_out(1.0,1.0, 0.0);

  

在包含全反射的图形中,全反射部分的反射光线则全是介质外部过滤颜色作用“多出来的”。

91.5 其他说明

完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9786258

Referrance

[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.

Q91:真实地模拟透明材质(Realistic Transparency)相关推荐

  1. Q91:真实地模拟透明材质(Realistic Transparency)(2)——Triangle Meshes

    这一章节是在"Q91:真实地模拟透明材质(Realistic Transparency)"的基础上测试一下Triangle Mesh图形. 之前章节的链接:http://blog. ...

  2. Q91:真实地模拟透明材质(Realistic Transparency)(4)——Fish Bowl

    1,理论分析 这一章节要画的是鱼缸,其实和前面画的"一杯水"是差不多的. 只不过这里是用各种"基本图形"构建的是一个"鱼缸". 示意图如下: ...

  3. Q91:真实地模拟透明材质(Realistic Transparency)(3)——A Glass of Water

    1,理论分析 怎么画一杯水呢? 场景中涉及三种介质:空气(eta_air).玻璃(eta_glass).水(eta_water). 在用trace的过程中,需要特别注意的是:介质边界面的法向量的方向. ...

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

    为什么说是"简易地模拟"呢? 因为,在两种介质确定了的情况下,这一章节中认为折射系数kt是一个常数,对应反射系数kr=1-kt. 但是,实际情况则是:kt会因入射角的不同而变化. ...

  5. Q101:真实地模拟一个玻璃酒杯(Wine Glass)(回旋曲面)

    0,引入 其实,这一章节的标题原本想用"Q91:真实地模拟透明材质(Realistic Transparency)(5)--Wine Glass",以便和之前透明材质相关章节联系起 ...

  6. 带透明材质的描绘过程_透明的过程质量

    带透明材质的描绘过程 这次,我想看看软件开发过程中如何支持质量. 我们将分析此类过程的某些阶段,并检查各个步骤的明确存在如何支持团队和组织的质量维护. 以下是我多年的观察中的问题,在寻找有关质量控制的 ...

  7. 计算机网络透明网桥的算法,网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟.doc...

    网基课程设计曼切斯特编码模拟透明网桥自习域转发帧算法模拟IP分片模拟 计算机网络基础 课 程 设 计 报 告 学号: 姓名: 班级: 题号:01.06.07 题目:曼切斯特编码模拟.透明网桥自学习域转 ...

  8. Unity Shader UV动画之高光材质加上透明材质与UV动画

    理解,UV动画实质是对UV的坐标进行变化,从而使纹理产生动态变化 例子:从高光材质进行修改 1,加上透明材质的标签以及混合模式,再使用带透明通道的贴图,可以实现:不透明部分的图案,材质是高光材质,透明 ...

  9. android游戏备份农场,真实农场模拟

    打工是不可能打工,这辈子都不可能的,只能靠经营农场来维持一下生活!真实农场模拟带给玩家最真实的经营农场的体验,玩家们在农场中养殖各种动物,植物,照顾它们长大,换取钱财,来支持你农场日常的花销.享受农场 ...

最新文章

  1. 【CVPR 2020】弱监督怎样做图像分类?上交大提出自组织记忆网络
  2. 那些复杂的技术设计的开始离我们并不遥远
  3. Asp.net 内置对象
  4. Spring Cloud【Finchley】-06服务消费者整合Feign
  5. 跨平台 C/C++ memcached 客户端 memcacheclient 介绍
  6. stm32 web get 参数_BlackHat2020议题之Web缓存投毒
  7. locat add filter
  8. 【2019南昌邀请赛网络赛 J】Distance on the tree【边权树剖+主席树】
  9. GIS相关网站、社区、论坛收藏
  10. RestSharp的使用记录
  11. 随机生成一注双色球号码
  12. ElasticSearch教程——倒排索引及其数据结构以及优缺点
  13. 前端小项目(四)| 咖啡厅网页页面
  14. c语言 众数,C语言实现查找一组数中的众数
  15. 立方尾不变-Python
  16. Android开发如何进阶,薪资如何跟上年龄的脚步?,深度解读Netty
  17. zxr10交换机配置手册vlan_中兴ZXR10配置说明.doc
  18. 信杂比公式_关于信噪比SNR【转载】
  19. 矩阵相似,矩阵合同,矩阵等价概念总结
  20. 解决小米pad USB安装apk时AS报错:INSTALL_FAILED_USER_RESTRICTED

热门文章

  1. 受够了碎片化,Salesforce决定只支持部分安卓设备
  2. android gradle NDK简介
  3. Java加密算法(十一)——双向认证
  4. 封装的ini文件类。保存为unicode的。解决delphi xe的TiniFile保存后不为unicode的问题...
  5. 在IntelliJ IDEA中clone项目代码
  6. 【排序+难题】LeetCode 41. First Missing Positive
  7. keras ConvLSTM2D 的简单应用
  8. Linux 基本命令(四)--时间 常用命令
  9. 《软技能—代码之外的生存指南》
  10. 4.Java JSON使用