本次光线追踪系列从基础重新开始,主要参照 Ray Tracing in One Weekend ,具体实现代码框架见 https://github.com/RayTracing/raytracing.github.io/。本文只是主要精炼光追相关理论,具体实现可参照原文。

本部分,我们来实现光线在漫反射材质表面反射的效果。

一、漫反射原理

如果光线射向漫反射材质物体(表面不规则),则反射光线具有随机的方向。以刚刚的场景为例,一个大球上面有个小球,材质均为漫反射材质。下面的三条射线,具有不同的随机反射行为:

下面我们用一种简单的方法实现这种随机反射行为:

假设某条射线(即下图中绿色的射线)命中了我们场景中的球,命中点为p,则我们可以人为地定义一个跟p点相切的单位球,在球体内部随机找一个点s,则 p指向s的向量 就是我们想要的反射向量。其中,N为P点上的单位法向量,可得单位球球心的坐标为p+N。

可以通过一种简单的算法来找到单位球体内部的随机点s:
**第一步:**在一个x,y,z的范围为-1到1的单位立方体里面,随机取一个点;
第一步,代码如下:

vec3 random_in_unit_sphere() {vec3 p;do {p = 2.0*vec3(random_double(), random_double(), random_double()) - vec3(1,1,1);} while (p.squared_length() >= 1.0);return p;
}

**第二步:**判断该点到立方体中心的距离是否<1,若是,则该点在单位球体内,算法结束。否则,重复第一步和第二步。
第二步,代码如下:

vec3 s_world = p + normal + random_in_unit_sphere();

二、反射递归光线追踪

接下来开始用递归实现反射射线的采样。漫反射材质本身不发光,我们发射的射线采样到其表面的颜色,本质上,就是射线命中其表面后,反射射线采样到的颜色,而反射射线可能会进一步命中其他物体,继续反射下去。

我们继续用两个漫反射材质的球体为例:

上图的蓝色射线,到达A点后开始反射,反射后到达B点继续反射,最后没有命中其他物体了,才会采样到远处某点的颜色,例如我们定义的天空的蓝色。

可以用递归来实现这种行为,假设每次反射会被吸收一半的光线能量,则每次的反射采样的返回值要减半,只需增加两行代码:

//发射一条射线,并采样该射线最终输出到屏幕的颜色值值
vec3 color(const ray &r, hittable *world)
{hit_record rec;if (world->hit(r, 0.001, MAXFLOAT, rec)) //射线命中物体{vec3 s_world = rec.p + rec.normal + random_in_unit_sphere(); //1.单位球内的一个点sreturn 0.5 * color(ray(rec.p, s_world - rec.p), world);   //2.递归采样}else{//采样天空的颜色vec3 unit_direction = unit_vector(r.direction());float t = 0.5 * (unit_direction.y() + 1.0);return (1.0 - t) * vec3(1.0, 1.0, 1.0) + t * vec3(0.5, 0.7, 1.0);}
}

如果光线一直反射,则上述递归会一直进行下去,直到射线没有命中物体,则采样天空的颜色并返回。

三、伽马校正

由于我们没有定义材质本身的颜色,也没有实现颜色的混合,所以目前看到的两个球体都呈现出暗蓝色,也就是射线在球体表面反射后,采样到的天空淡蓝色衰减后的颜色。

目前图像的颜色非常地暗,因为没有进行伽马校正,现在简单粗暴地对颜色值开方,实现类似伽马校正的效果。只需在入口函数中新增一行代码:

void RayTracing()
{...for (int j = ny - 1; j >= 0; j --){for (int i = 0; i < nx; i++){for(int s = 0; s < ns; s++)    //随机采样100次{...col += color(r, world);}col /= float(ns);  col = vec3( sqrt(col[0]), sqrt(col[1]), sqrt(col[2]) ); //伽马校正}}
}

伽马校正后效果如下:

【光线追踪系列五】漫反射(Diffuse)相关推荐

  1. python解复杂方程_Python数据处理篇之Sympy系列(五)---解方程

    前言 sympy不仅在符号运算方面强大,在解方程方面也是很强大. 本章节学习对应官网的:Solvers 官方教程 (一)求解多元一次方程-solve() 1.说明: 解多元一次方程可以使用solve( ...

  2. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

    <ASP.NET Core In Action>读书笔记系列五 ASP.NET Core 解决方案结构解析1 参考文章: (1)<ASP.NET Core In Action> ...

  3. Silverlight Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)

    原文:Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations) 正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Bl ...

  4. 盘点2013年那些最优秀的网页设计作品【系列五】

    这个系列的文章向大家展示2013年最优秀的国外网页设计作品,这些都是过去的一年在图片,纹理,导航等等各个方面的优秀网站.2013年,网页设计领域出现了几个新的流行趋势,最热门的就是响应式设计(Resp ...

  5. 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引

    数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引 [建立一个搜索引擎大致需要做这样几件事:自动下载尽可能多的网页:建立快速有效的索引:根据相关性对网页进行公平准确的排序.我们在介绍 Googl ...

  6. 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)

    NAS是我觉得家里必不可少的一台设备,NAS 全称 Network Attached Storage,即网络附加存储服务器,它通过自身的操作系统和 SMB/NFS/CIFS/FTP 等多种通信协议来给 ...

  7. VS 中配置使用Visual SVN系列 五:SVN Client的配置和使用

    VS 中配置使用Visual SVN系列 五:SVN Client的配置和使用 1.TortoiseSVN上传项目文件 2.VS中同步该项目文件 到此VS 中配置使用Visual SVN系列已经完成如 ...

  8. 【Unity Shader】三、漫反射Diffuse Shader例子

    学习目标: 漫反射Diffuse Shader,逐顶点计算和逐像素计算. 半兰伯特(HalfLambert)光照模型. 结合材质自身的色彩(Material Color)及环境光(Ambient). ...

  9. 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...

    为什么80%的码农都做不了架构师?>>>    版权声明:本文由本人撰写并发表于2012年9月份的<程序员>杂志,原文题目<一种支持自由规划的Sharding扩容方 ...

  10. C#系列五《程序的分支》

    从前面的文章中我们不难看出来,我们程序的执行顺序是从上到下顺序执行的,那么有时候我们需要程序在某个条件成立时,执行指定的代码片段,那么怎么样来控制这样流程呢?这个就是我们今天这篇文章所需要讨论的.那么 ...

最新文章

  1. Golang mysql数据库
  2. MySQL 每秒57万的写入,带你飞呀!
  3. 深入理解浏览器原理和架构|硬核
  4. npm install --save
  5. php 501解决办法,PHP 使用错误处理解析
  6. Java中List和Map接口之间的区别
  7. eBPF:bpftrace pidnss.bt 的CentOS kernel-3.10版本
  8. 并发模式之Future模式
  9. 33.前端之css2
  10. Midori 0.5 发布,轻量级跨平台网页浏览器
  11. 二分(POJ - 3273 )
  12. mysql fabric HA测试
  13. 苹果支付返回html,苹果应用内支付,服务器端的实现
  14. 2000字精华总结,安利一个超好用的 Python 数据分析神器
  15. SQL的采集与查询教程
  16. 最大岛屿 计蒜客--T1405
  17. 孩子快抓住妈妈的手 -- 转载
  18. 关于我用cuda实现蒙特卡洛估算圆周率中遇到的问题
  19. java 航班_Java实现简单航班查询系统-Go语言中文社区
  20. 【tutorabc多少钱一节课】上完课的我来说说真实感想

热门文章

  1. 自考-计算机程序设计-1-概论
  2. Android TV真机测试
  3. 关于WPF你应该知道的2000件事
  4. 深入解析J.U.C并发包(十五)—— Thread - Specific Storage(ThreadLocal)模式
  5. linux 桌面美化指南,Linux_9方面立体式地美化Ubuntu桌面,总结了一下桌面美化的设置。 - phpStudy...
  6. BTA12A-ASEMI高效mos管BTA12A
  7. 机器学习学习笔记之——处理文本数据
  8. SQL Server 2019下载及安装教程
  9. Huginn实现自动通过slack推送豆瓣高分电影
  10. 万条票房数据看2019春节档各地影院表现