由于在镜面反射中,光线几乎可以保持来自光源的全部能量,并在表面曲度和折射率的作用下,产生聚焦或者发散,当这种光线接触到场景中其它对象的表面时,又会产生新的照明效果,于是焦散便产生了。

简而言之,即是:Reflective材质物体的所反射的光打在Matte材质物体上。

为了使“焦散效果”比较明显,我们选择圆柱面作为Reflective材质的物体。

相关代码:

void
World::build(void) {int num_samples = 100; // 5041vp.set_hres(400);vp.set_vres(400);vp.set_samples(num_samples);vp.set_max_depth(5);tracer_ptr = new PathTrace(this);Pinhole* pinhole_ptr = new Pinhole;pinhole_ptr->set_eye(5, 10, 20);pinhole_ptr->set_lookat(-1, 1, 0);pinhole_ptr->set_view_distance(500);pinhole_ptr->compute_uvw();set_camera(pinhole_ptr);// emissive sphereEmissive* emissive_ptr = new Emissive;emissive_ptr->scale_radiance(20.0);emissive_ptr->set_ce(0.75, 1, 0.75);      // light greenSphere* sphere_ptr = new Sphere(Point3D(-2, 7, 6), 2);sphere_ptr->set_material(emissive_ptr);sphere_ptr->set_sampler(new MultiJittered(num_samples));add_object(sphere_ptr);// reflective rectangleReflective* reflective_ptr = new Reflective;reflective_ptr->set_ka(0.0);reflective_ptr->set_kd(0.0);reflective_ptr->set_ks(0.0);reflective_ptr->set_exp(1.0);reflective_ptr->set_kr(0.95);reflective_ptr->set_cr(1.0, 0.2, 0.2);double bottom    = -1.0;double top      =  1.0;double radius   =  7.0;OpenCylinder* cylinder_ptr = new OpenCylinder(bottom, top, radius);cylinder_ptr->set_material(reflective_ptr);add_object(cylinder_ptr);// planeMatte* matte_ptr = new Matte;matte_ptr->set_ka(0);matte_ptr->set_kd(0.75);matte_ptr->set_cd(white);matte_ptr->set_sampler(new MultiJittered(num_samples));Plane* plane_ptr = new Plane(Point3D(0, -1.0, 0), Normal(0, 1, 0));plane_ptr->set_material(matte_ptr);add_object(plane_ptr);
}

输出图形:

单像素点的采样次数为1,耗时236s:

单像素点的采样次数为100,耗时755s:

单像素点的采样次数为1000,耗时3256s:

圆柱面内部白色平面上的那些红色光影即是:圆柱镜面产生的反射焦散效果。

(最后这张图中应该是有个bug:平面上多出一个白色圆盘。不知是怎么回事,暂不追究)

Q88:全局光照(Global Illumination)——Path Tracing算法生成反射焦散效果的图形相关推荐

  1. Q88:全局光照(Global Illumination)——Path Tracing

    88.1 引入(Introduction) 截至当前,回忆一下我们学过的针对直接光照和间接光照的不同反射模型. 直接光照: Phong反射模型.包含漫反射部分和高光反射部分. 间接光照: 对于镜面材料 ...

  2. (中文详解篇)smallpt: 99行代码完成全局光照Path Tracing

    目录 0. 什么是SmallPT Features 1. 光线追踪需要了解知识 1.1 什么是全局光照? 1.2 渲染方程 2. SmallPT代码分析 2.1 代码块1 2.2 代码块2 2.2.1 ...

  3. 全局光照技术解析Global Illumination Explained

    解析全局光照Global Illumination Explained 前言:Global Illumination全局光照技术是实时渲染的必然发展方向.我参考了一些研究成果,琢磨了一下,让更多的人可 ...

  4. GAMES101课程学习笔记—Lec 14(2)~16:Ray Tracing(2) BRDF、渲染方程、全局光照、路径追踪

    GAMES101课程学习笔记-Lec 14(2)~16:Ray Tracing(2) BRDF.渲染方程.全局光照.路径追踪 0 引入--辐射度量学概述 1 相关概念 1.1 Radiant Ener ...

  5. Q89:全局光照(Global Illumination)——Path Tracing(只用于间接光照)

    89.1 Path Tracing只用于间接光照 根据Path Trace的算法,只有当最终的反射光线撞击到发光材质物体时,才会对最初的撞击点进行"有效"着色,否则着色为" ...

  6. Unity 5 中的全局光照技术详解

    简介 全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常有挑战性,付出的代价也高,正因为如此,现代游戏会先一定程度的预先处理这些计算,而非游戏执行时实时运算. ...

  7. Unity5 全局光照

    转载自:Unity 5 中的全局光照技术详解 简介 全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常有挑战性,付出的代价也高,正因为如此,现代游戏会先一定程度 ...

  8. (六)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:上篇(全局照明GI和局部照明)

    一.全局照明和局部照明 全局照明(global illumination,GI)是用于向三维场景中添加更为逼真的光照效果的一组算法总称.全局算法不仅考虑光源发出的光与被照亮物体之间的关系,即直接照明( ...

  9. 实时高清渲染:全局光照(Global Illumination)[1]

    目录 基础知识: Radiance: Irradiance: Radiant flux: Radiant Intensity: Solid Angle: Lambertian surface: Lam ...

最新文章

  1. 袋鼠过河(动态规划)
  2. 如何解决数据丢失问题
  3. 表单一次性上传多个文件
  4. c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
  5. Spring Data JPA - 参考文档 地址
  6. ThinkPHP内核微信拼团购物商城小程序源码
  7. “C语言之父”40年前搞的操作系统复活,Linux、Windows都借鉴过它
  8. 短视频网站源码干货分享:如何实现背景音乐和美颜功能
  9. VSCode 中文乱码
  10. 数据结构 -- 景区旅游信息管理系统
  11. CSS 特异度、继承、求值过程简介
  12. 怎样把英文pdf翻译成中文?
  13. 点估计与区间估计、置信区间、置信水平
  14. 技术人员如何创业:打造超强执行力团队
  15. 高手修车都用示波器: 示波器是什么?如何选购?
  16. RK3288 系统升级流程
  17. Elasticsearch 第三方工具包Bboss的简单使用
  18. android2.1源代码结构
  19. 从技术宝库到云上机遇:华为云开天aPaaS的“修路记”
  20. .net基础学java系列(五)慢性自杀 之 沉沦在IDE中

热门文章

  1. 智能卡开发的相关总结
  2. LVS负载均衡DR模式+keepalived
  3. 沈志勇-百度大数据引擎与分析预测
  4. 炒冷饭系列:设计模式 单例模式
  5. C# Winform添加全局快捷键(老板键)
  6. win10中plt绘图显示中文
  7. 几种常用排序(归并,希尔,快排,堆排.......)
  8. Struts2的OGNL标签详解
  9. 【利用存储过程和三层架构完成新闻发布】
  10. SQL-Server 语句存档整理