蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术

首先分析一下生成随机Ray的程序:

vec3 random_in_unit_disk() {vec3 p;do {p = 2.0*vec3(rand() / (RAND_MAX + 1.0), rand() / (RAND_MAX + 1.0),0.0)-vec3(1,1,0);} while (dot(p, p) >= 1.0);return p;
}

rand() / (RAND_MAX + 1.0)用来产生 0-1之间的随机数,

2.0*vec3(rand() / (RAND_MAX + 1.0), rand() / (RAND_MAX + 1.0),0.0)-vec3(1,1,0); 就是为了产生 x在[-1,1]之间,并且 y也在[-1,1]之间的数据,并且还要让该数据在圆盘里(通过dot(p,p)>1.0来判断)。

然后是摄像机类:

 camera(vec3 lookfrom,vec3 lookat,vec3 vup,float vfov,float aspect,float aperture,float focus_dist) {lens_radius = aperture / 2;float theta = vfov*M_PI / 180.0;float half_height = tan(theta / 2);float half_width = aspect * half_height;origin = lookfrom;w = unitVector(lookfrom - lookat);u = unitVector(cross(vup, w));v = cross(w, u);//lower_left_corner = vec3(-half_width, -half_height, -1.0);lower_left_corner = origin - half_width*focus_dist*u -half_height*focus_dist*v - focus_dist*w;horizontal = 2*half_width*focus_dist*u;vertical = 2*half_height*focus_dist*v;}

首先设置了镜头的半径,然后计算出half_height和half_width,以及w,u,v

以及找到屏幕中最左下角的点。

其实,lower_left_corner = origin - half_width*focus_dist*u -half_height*focus_dist*v - focus_dist*w;这行代码中,

首先要记得我们传入的参数里,focus_dist= (lookfrom - lookat).length()

所以oringin-focus_dist*w 得到的是 lookat的坐标点。

然后是get_ray代码

 ray get_ray(float s, float t) {vec3 rd = lens_radius*random_in_unit_disk();vec3 offset = u*rd.x() + v*rd.y();return ray(origin+offset,lower_left_corner+s*horizontal+t*vertical-origin-offset);}

得到的是光圈里的采样射线。

这样就有一个聚焦的效果,比如我们的焦点(focus_dist)为如下图:

我们变动一下焦点距离:

注意,这只是在每个点采样范围变大来导致模糊,而不是整体图像会因此上下倒转。上图是侧面图,紫色线段表示的是每个像素点。

《一周学完光线追踪》学习 十一点五 离焦模糊代码原理分析相关推荐

  1. 《一周学完光线追踪》学习 三 光线相机和背景

    蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术 所有光线跟踪器都有一个光线类,以及计算沿光线看到的颜色.让我们把射线看作一个函数,p(t)=A+t*B,这里p是3D中沿直线的3D位置,a是射线的原 ...

  2. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  3. 十天学完Vue学习总结

    一.学习时间的安排 每次学习一门新语言的时候,我会习惯性创建一个文件夹,到我学完Vue基础时一共用了十天的时间.每一天几乎是一个知识点,或者是知识点对于的作业或者是项目. 二.共有多少个知识点可以学习 ...

  4. 如何两周学完操作系统?我是这样做的

    非科班转码用考研书来学习操作系统真的高效又通俗易懂 (怕大家说我是营销号,我把书籍的机构给抹除了) 结合授课视频和辅导书真的能够快速学完操作系统,而且是高质量学完,视频能够讲解算法具体细节,以及相关操 ...

  5. 计算机编程课要不要学,学完编程课还是不会写代码,问题到底出在哪?

    作为一名青椒,这几年在大学的教学工作做下来,发现无论是计算机专业的学生,还是把编程作为公修课的其他专业学生,很多人内心都有一个灵魂拷问--为什么我认真听课,认真看书书,几个月甚至一年下来但还是写不好代 ...

  6. 一周学完MyBatis源码,万字总结

    点击下方"IT牧场",选择"设为星标" 之前,我给大家分享给很多MyBatis源码分析的一系列文章.今天,就自己的感受来做一个整体的总结. 众所周知,MyBat ...

  7. 系统学习深度学习(五) --递归神经网络原理,实现及应用

              递归神经网络(RNN),是两种人工神经网络的总称,一种是时间递归神经网络(recurrent neural network),另一种是结构递归神经网络(recursive neur ...

  8. 从零开始的AI·吃透kNN算法,学完我悟了(附实例代码)

    从零开始的AI系列 从零开始的AI·机器学习の基本概念 从零开始的AI·决策树原来这么好理解(附实例代码) 从零开始的AI·朴素贝叶斯?拿来吧你(附实例代码) 文章目录 从零开始的AI系列 前言 一. ...

  9. python通过封装可以实现代码复用_Python学习笔记(五)函数和代码复用

    函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print().同样,你也可以自己创建函数, ...

最新文章

  1. eclipse adt如何切换到设计界面_APP界面设计模板|引导页该如何设计?
  2. 旗帜鲜明地反对“码而优则仕”
  3. (转)让你受益终身的10个Word实用技巧
  4. SharePoint判断页面(或WebPart)是否处于编辑模式.
  5. 成功解决TypeError: Cannot cast array data from dtype('float64') to dtype('U32') according to the rule '
  6. ajax 错误信息error,jquery ajax的error错误信息
  7. 【gateway系列】手把手教你gateway整合nacos注册中心
  8. 大数据之-Hadoop3.x_MapReduce_WordCount案例环境准备---大数据之hadoop3.x工作笔记0088
  9. visual studio 资源编辑器 标尺和参考线,网格线
  10. 视频教程-H3CS-WLAN 无线工程师认证-H3C认证
  11. C/C++实现关闭命令行快速编辑模式(Windows系统)
  12. 神经网络计算棒怎么用,英特尔神经计算棒拆解
  13. altium designer绘制51单片机最小系统
  14. Android UI
  15. BZOJ 4199 [Noi2015]品酒大会(后缀自动机 + parent树上统计)
  16. 罕见整套ZBrush笔刷合集,看完马上收藏了
  17. 2021-03-31
  18. 网页电话/手机号码识别
  19. 传奇开服教程,传奇开服需要学多久? 开传奇sf需要准备什么呢? 开传奇需要多少本钱?---开服流程
  20. 上海迅柏尼科技谈视频会议系统

热门文章

  1. linux for 迅雷,关于迅雷for linux
  2. linux网络查看,Linux网络命令(网络环境查看和网络测试命令)
  3. 我是个程序员,每天敲敲打打,哪天电脑崩溃了会发现我这辈子啥都没留下
  4. Python实用案例,Python脚本,Python实现批量下载百度图片
  5. oracle 加权久期,久期 - MBA智库百科
  6. API中endpoints是什么意思?
  7. 2020牛客NOIP赛前集训营-普及组第三场C牛半仙的妹子树
  8. Android新浪微博授权提示:文件不存在 C8998 的终极解决方法
  9. java文字水印换行_Java实现图片水印文字换行、平铺、旋转效果-Go语言中文社区...
  10. php 输入表格数据,怎样将导出数据输入Excel 表格-php 怎么把数据导出到excel表格...