0.简介

前面的反射效果已经和非光追渲染有很大区别了,这回加上折射计算,效果会更好。

1.折射计算

折射计算相对反射要复杂一点,折射公式网上有的是,我就不在这里进行推导和详细讲解了,有需要的可以看下面这篇博客。

光线折射计算

2.添加计算代码

在之前的反射光线附近添加折射光线计算代码,然后折射也进行光追迭代。

光线追踪迭代函数。

Ray rayTrac(Ray ray, vector<Polygon*> s, int times)
{Ray r(vec3(0, 0, 0), vec3(0, 0, 0), 0, vec3(0, 0, 0), nullptr);if (times <= 0)return r;float minDistance = FLT_MAX;for (auto obj : s){//找到最近的物体Ray rayTemp = obj->intersect(ray);if (rayTemp.polygon && rayTemp.distance < minDistance){minDistance = rayTemp.distance;r = rayTemp;}}if (r.polygon == nullptr)return Ray(vec3(0, 0, 0), vec3(0, 0, 0), 0, vec3(0, 0, 0), nullptr);//计算反射光线vec3 reflectRayNormal = r.normal;/*if (dot(r.direction , reflectRayNormal) > 0)reflectRayNormal = -reflectRayNormal;*///构造折射光线float itea = ((Polygon*)(r.polygon))->m->refract;float cosa1 = abs(dot(r.direction ,reflectRayNormal));float cosa2 = sqrt(1 - (1 / (itea * itea) * (1 - cosa1 * cosa1)));Ray refractRay = Ray(normalize((1 / itea) * r.direction + (cosa1 / itea - cosa2) * reflectRayNormal), r.end.position, 0, vec3(0, 0, 0), nullptr);//构造反射光线Ray reflectRay = Ray(normalize(r.direction - (2 * dot(r.direction, reflectRayNormal)) * reflectRayNormal), r.end.position, 0, vec3(0, 0, 0), nullptr);//获得反射光线方向refractRay = rayTrac(refractRay, s, times - 1);reflectRay = rayTrac(reflectRay, s, times - 1);//计算物体返回的颜色r = ((Polygon*)(r.polygon))->sample(r, reflectRay, refractRay);return r;
}

对于平面有折射的处理代码,球也有,但是之前出了点问题,所以调试了好几次才找到,这里需要注意的是,如果光线进入球体内,那么折射光线会穿过球体,所以要区分光线在球体内发射还是在球外,对于平面,要考虑平面部分正反面,两面都能反光和折射。

Ray Sphere::intersect(Ray ray)
{Ray result(ray.direction,ray.position,ray.intensity, vec3(0,0,0), nullptr);//计算球和光线的向量vec3 v = ray.position - center;//如果光源在球体表面或者内部,要专门注意这种情况if (abs(length(v) - radius) < 0.001 && dot(normalize(v) , ray.direction) <= 0){result.polygon = this;    float cosa = glm::dot(normalize((center - ray.position)), normalize(ray.direction));//normalize(abs((center - ray.position))*normalize(ray.direction));result.distance = 2 * radius * abs(cosa);result.end = ray.getEndPoint(result.distance);result.normal = -normalize(result.end.position - center);return result;}float disSubR = dot(v , v) - (radius * radius);float ray_v_dot = dot(ray.direction , v);if (ray_v_dot <= 0){float discr = ray_v_dot * ray_v_dot - disSubR;if (discr >= 0){result.polygon = this;result.distance = -ray_v_dot - sqrt(discr);result.end = ray.getEndPoint(result.distance);result.normal = normalize(result.end.position - center);return result;}}return result;
}

3.效果

折射效果

4.源码

release0.11

学习光线追踪(16)---折射计算[1]相关推荐

  1. 《用一周学习光线追踪》2.BVH树、AABB相交检测

    本项目上接<用两天学习光线追踪>,继续学习光线追踪. 项目链接:https://github.com/maijiaquan/ray-tracing-with-imgui 目录: <用 ...

  2. 《用两天学习光线追踪》3.球体和表面法向量

    本项目参考自教程<Ray Tracing in One Weekend>,在跑通了所有例子之后,加上了自己的理解写成笔记,项目使用CPU多线程提速,并增加了GUI进度显示. 项目链接:ht ...

  3. Hadoop学习笔记—16.Pig框架学习

    Hadoop学习笔记-16.Pig框架学习 一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin, ...

  4. 米的换算单位和公式_数学单位换算公式,1-6年级计算必备!

    原标题:数学单位换算公式,1-6年级计算必备! 在小学数学的学习中,单位换算贯穿始终.无论是在小升初数学考试中,还是在生活方面,都会涉及单位换算的问题. 在小学阶段,主要涉猎的单位换算包括长度.面积. ...

  5. Python学习日志16 - 数据库SQL查询

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志16课 - 数据库SQL查询 DQL ...

  6. Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析)

    Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析_2020.06.25) 前言: Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一 ...

  7. 区块链学习笔记16——ETH交易树和收据树

    区块链学习笔记16--ETH交易树和收据树 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 交易树和 ...

  8. 《用两天学习光线追踪》1.项目介绍和ppm图片输出

    本项目参考自教程<Ray Tracing in One Weekend>,在跑通了所有例子之后,加上了自己的理解写成笔记,项目使用CPU多线程提速,并增加了GUI进度显示. 项目链接:ht ...

  9. 为什么深度学习需要与边缘计算进行结合?如何结合?

    一.深度学习的发展 近年来,机器学习普遍应用于各个领域.我们也被机器学习的应用所包围,比如:在计算机程序.媒体等领域经常接触.本质上,机器学习使用算法从数据中提取有用的信息,然后将其呈现在一个模型中, ...

最新文章

  1. 「杂谈」白身,初识,不惑,有识,你处于深度学习哪一重境界了
  2. 关于求N个无序数中第K大的数。
  3. Zookeeper下载
  4. 史上最全Winform中使用ZedGraph教程与资源汇总整理(附资源下载)
  5. python xyz_python中xyz坐标的欧几里德距离
  6. 百度打造AIR智能道路系统,可降低90%交通事故
  7. oracle 返回hashmap,解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错...
  8. 机器学习基础(二)——词集模型(SOW)和词袋模型(BOW)
  9. 【二次开发应用】安信可ESP32/ESP8266模组入网阿里生活物联网平台
  10. Matlab存tif格式图片
  11. 【一步一步教会您升级到win7旗舰版】
  12. python简单实现天猫手机评论标签提取--自然语言处理
  13. 微信个性化菜单 java_java_java微信开发API第四步 微信自定义个性化菜单实现,微信如何实现自定义个性化菜 - phpStudy...
  14. 画一只会动的皮卡丘(上)
  15. 云耀服务器切换系统,云耀云服务器切换操作系统
  16. 生信格式 | bigwig,bw (基因组浏览器绘制)
  17. new plat (vcam+wifi)项目调试
  18. 挑灯夜读——JavaWeb:知识点梳理
  19. 使用IText7 生成PDF文档
  20. 研读网络安全法律法规,提升技术管理者 “法” 商

热门文章

  1. 微信公众号推送天气教程,自动定时推送【Java版】开发者和小白详细教程
  2. 双线macd指标参数最佳设置_经典实用的双线MACD指标
  3. 用R语言开始量化投资
  4. IPCAM视频数据解码并处理
  5. 在IPCam上搭建WEB服务并通过CGI交互的相关问题
  6. SpringBoot总结(六)--连接oracle数据库demo
  7. 如何使用腾讯云轻量服务器以及WooCommerce 应用镜像搭建跨境电商独立站!
  8. jq 隔行变色(横、纵)
  9. 资源-Windows10-2020原版镜像下载地址(20H2)以及1809、1803、1709
  10. 《用于预测蛋白质-配体结合亲和力的结构感知交互图神经网络》