《Ray Tracing in One Weekend》笔记 - 【Chapter 9】:Dielectrics
《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相关推荐
- 《Ray Tracing in One Weekend》——Chapter 9: Dielectrics
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题二十四:怎么模拟ray tracing图形中介质材料的颜色(dielectric) 遇到问题,就要 ...
- 《Ray Tracing in One Weekend》——Chapter 12: What's next?
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题三十:<Ray Tracing In One Weekend>封面图形生成 第二部分: ...
- 《Ray Tracing in One Weekend》——Chapter 11: Defocus Blur
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题二十八:ray tracing中的散焦模糊(defocus blur) 接着,对比调了一下相机的各 ...
- 《Ray Tracing in One Weekend》——Chapter 10: Positionable camera
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题二十七:ray traing中的positionable camera 第二部分:原文截图 总结& ...
- 《Ray Tracing in One Weekend》——Chapter 8: Metal
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal) ...
- 《Ray Tracing in One Weekend》——Chapter 7: Diffuse materials
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials) 当 ...
- 《Ray Tracing in One Weekend》——Chapter 6: Antialiasing
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十八:怎么对ray tracing图形进行消锯齿 第二部分:原文截图 总结<Ray Trac ...
- 《Ray Tracing in One Weekend》——Chapter 5: Surface normals and multiple objects
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十四:怎么可视化球的法向量 问题十七:怎么用ray tracing画多个球? 中途又补充了点C++ ...
- 《Ray Tracing in One Weekend》——Chapter 4: Adding a sphere
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十三:怎么用ray tracing画个球 第二部分:原文截图 总结<Ray Tracing ...
- 《Ray Tracing in One Weekend》——Chapter 3: Rays, a simple camera, and background
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 原文中提到的"background"就是咱们的第一个ray tracing图形啦. ...
最新文章
- oracle菜鸟学习之 分析函数-排序
- decorator and @property
- 用python播放音乐_Python实例讲解 -- 定时播放 (闹钟+音乐)
- python读csv-python读写csv文件
- 【干货】Python参考书籍
- git pull的理解 以及 git conflict的解决
- python机器学习系列教程——深度学习框架比较TensorFlow、Theano、Caffe、SciKit-learn、Keras
- 作用域public,private,protected,以及不写时的区别
- gerrit push失败问题解决
- 无危害有好玩的电脑病毒下载-01期
- 新建计算机管理员账户,Win10如何新建本地管理员账户
- linux延迟加载so,WebRTC Linux ADM 实现中的符号延迟加载机制
- 纯ALOHA协议和时隙ALOHA协议简单总结
- git错误集(updating)
- 痛并快乐着的研究生学习生涯(4)-9.4
- html中黄色的代码是什么,HTML黄色欧美形式创意展示网页模板代码
- 深度学习论文阅读目标检测篇(四)中英文对照版:YOLOv1《 You Only Look Once: Unified, Real-Time Object Detection》
- Springboot毕设项目vue酒店房间管理系统xukt9(java+VUE+Mybatis+Maven+Mysql)
- 搜索引擎Lucene(2):索引文件结构及格式
- Camera摄像头模组硬件