《Ray Tracing in One Weekend》 笔记 - Chapter9:会发生折射的材质

该小节中实现了表面会发生折射现象的材质。

模型假设
1.文章在实现上做了一些简化,每当光线与该类材质物体表面发生碰撞,便在折射光线和反射光线之间做一次选择,仅生成一种光线。

2.折射光线的生成需要满足折射定律。



3. 全内反射:
“又称全反射(total internal reflection,TIR),是一种光学现象。当光线从较高折射率的介质进入到较低折射率的介质时,如果入射角大于某一临界角θc(光线远离法线)时,折射光线将会消失,所有的入射光线将被反射而不进入低折射率的介质。"【百科】

实现


// -------- dielectric.h -------- //

#ifndef DIELECTRIC_H
#define DIELECTRIC_H#include "material.h"
#include "metal.h"class dielectric : public material
{
public:dielectric(float ri) :ref_idx(ri) {}virtual bool scatter(const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered) const;float ref_idx;  // 相对空气介质的折射系数
};
#endif // ! DIELECTRIC_H

// -------- dielectric.cpp -------- //

#include "dielectric.h"// 判断是否会发生全反射
bool refract(const vec3& v, const vec3& n, float ni_over_nt, vec3& refracted) {// 先将入射光线转化为单位向量vec3 uv = unit_vector(v);float dt = dot(uv, n);float discriminat = 1.0 - ni_over_nt * ni_over_nt * (1.0 - dt * dt);if (discriminat > 0) {refracted = ni_over_nt * (uv - n * dt) - n * sqrt(discriminat);return true;}// discriminat < 0,则说明方向向量无实根,即没有实际的折射光线,认为出现全反射else {return false;}
}bool dielectric::scatter(const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered) const {vec3 outward_normal;vec3 reflected = reflect(r_in.getDirection(), rec.normal);float ni_over_nt;  // 折射介质与空气介质折射率的比值attenuation = vec3(1.0, 1.0, 1.0);vec3 refracted;// 入射方向与小球表面法向量点乘大于0,说明光线从球体内部射入空气if (dot(r_in.getDirection(), rec.normal) > 0) {outward_normal = -rec.normal;ni_over_nt = ref_idx;}else {outward_normal = rec.normal;ni_over_nt = 1.0 / ref_idx;}// 若未发生全反射,生成折射光线,否则生成反射光线if (refract(r_in.getDirection(), outward_normal, ni_over_nt, refracted)) {scattered = ray(rec.p, refracted);}else {scattered = ray(rec.p, reflected);return false;}return true;
}

// -------- main.cpp -------- //

 hitable *list[4];list[0] = new sphere(vec3(0,0,-1), 0.5, new lambertian(vec3(0.8, 0.3, 0.3)));list[1] = new sphere(vec3(0, -100.5, -1), 100, new lambertian(vec3(0.8, 0.8, 0.0))); // 在半部分放一个大球作为地面list[2] = new sphere(vec3(1, 0, -1), 0.5, new metal(vec3(0.8, 0.6, 0.2)));list[3] = new sphere(vec3(-1, 0, -1), 0.5, new dielectric(1.5));

《Ray Tracing in One Weekend》笔记 - 【Chapter 9】:Dielectrics相关推荐

  1. 《Ray Tracing in One Weekend》——Chapter 9: Dielectrics

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题二十四:怎么模拟ray tracing图形中介质材料的颜色(dielectric) 遇到问题,就要 ...

  2. 《Ray Tracing in One Weekend》——Chapter 12: What's next?

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题三十:<Ray Tracing In One Weekend>封面图形生成 第二部分: ...

  3. 《Ray Tracing in One Weekend》——Chapter 11: Defocus Blur

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题二十八:ray tracing中的散焦模糊(defocus blur) 接着,对比调了一下相机的各 ...

  4. 《Ray Tracing in One Weekend》——Chapter 10: Positionable camera

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题二十七:ray traing中的positionable camera 第二部分:原文截图 总结& ...

  5. 《Ray Tracing in One Weekend》——Chapter 8: Metal

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal) ...

  6. 《Ray Tracing in One Weekend》——Chapter 7: Diffuse materials

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials) 当 ...

  7. 《Ray Tracing in One Weekend》——Chapter 6: Antialiasing

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十八:怎么对ray tracing图形进行消锯齿 第二部分:原文截图 总结<Ray Trac ...

  8. 《Ray Tracing in One Weekend》——Chapter 5: Surface normals and multiple objects

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十四:怎么可视化球的法向量 问题十七:怎么用ray tracing画多个球? 中途又补充了点C++ ...

  9. 《Ray Tracing in One Weekend》——Chapter 4: Adding a sphere

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十三:怎么用ray tracing画个球 第二部分:原文截图 总结<Ray Tracing ...

  10. 《Ray Tracing in One Weekend》——Chapter 3: Rays, a simple camera, and background

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 原文中提到的"background"就是咱们的第一个ray tracing图形啦. ...

最新文章

  1. oracle菜鸟学习之 分析函数-排序
  2. decorator and @property
  3. 用python播放音乐_Python实例讲解 -- 定时播放 (闹钟+音乐)
  4. python读csv-python读写csv文件
  5. 【干货】Python参考书籍
  6. git pull的理解 以及 git conflict的解决
  7. python机器学习系列教程——深度学习框架比较TensorFlow、Theano、Caffe、SciKit-learn、Keras
  8. 作用域public,private,protected,以及不写时的区别
  9. gerrit push失败问题解决
  10. 无危害有好玩的电脑病毒下载-01期
  11. 新建计算机管理员账户,Win10如何新建本地管理员账户
  12. linux延迟加载so,WebRTC Linux ADM 实现中的符号延迟加载机制
  13. 纯ALOHA协议和时隙ALOHA协议简单总结
  14. git错误集(updating)
  15. 痛并快乐着的研究生学习生涯(4)-9.4
  16. html中黄色的代码是什么,HTML黄色欧美形式创意展示网页模板代码
  17. 深度学习论文阅读目标检测篇(四)中英文对照版:YOLOv1《 You Only Look Once: Unified, Real-Time Object Detection》
  18. Springboot毕设项目vue酒店房间管理系统xukt9(java+VUE+Mybatis+Maven+Mysql)
  19. 搜索引擎Lucene(2):索引文件结构及格式
  20. Camera摄像头模组硬件

热门文章

  1. 测试手机电池性能的软件,电池性能早知道!安兔兔电池测试帮您忙
  2. 【嵌入式应用4】ROS话题编程
  3. 如何在 FlowUs、Notion 等笔记软件中使用「番茄工作法」?
  4. 等待任务执行完成时,界面上转圈圈,不让用户操作软件
  5. 【案例二】小明都可以买什么
  6. 米兰大学计算机科学,米兰大学
  7. 「我们只投这两种AI公司」, 三位局内人首次公开AI投资的技术与产业标准
  8. Type-C口充电器头为什么没有电压输出?
  9. type-c边玩边充电游戏手柄方案
  10. 如何储存图片方法jpg格式png格式#ps教程#ps抠图