随机采样和分布式光线追踪

本文主要叙述了论文【3】【4】中的两个方法,一种是随即采样,一种是分布式光线追踪方法,在介绍随机采样方法前,由泊松圆盘采样引入。

一.泊松圆盘采样(Poisson Disk Distribution

一个采样位置不均匀分布的例子就是眼睛,眼睛有有限数量的光感受器,就像其它采样过程一样,应该是有一个奈奎斯特极限(Nyquist limit),但是眼睛正常情况下是不会发生锯齿现象的。在眼睛的中央窝(Fovea)中,六边形图案的细胞是紧密排列起来的,晶状体就扮演着低通滤波器的作用,这就避免了锯齿的发生。但是在中央窝外部,细胞的排列都很稀疏,所以采样率是很低的,然而在那里却也没有发生锯齿,原因就是通过细胞的不均匀分布来避免这个区域发生锯齿。

已经有人过研究眼睛中视锥细胞的分布,与人眼相似,光感受器在猴子眼睛的中央窝外部的分布如图1所示,这样一个分布称之为泊松圆盘分布:采样点随机分布在一定的范围内且任意两个采样点之间的距离不小于某个值。距离的最小值能限制噪声的数量,举个例子,胶片颗粒(Film Grain)就是随机分布的,如图2所示,但是没有像泊松圆盘分布一样有最小距离的限制,而是采用纯随机分布。造成的结果就是一些样本点会集中一些区域而在其它的某些区域留下大量空白,所以胶片(Film)没有锯齿,有噪声(Noise)存在。

![猴子眼睛中光感受器的分布](https://img-blog.csdnimg.cn/20201203204422425.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N5ejIwMTU1ODUwMzEwMw==,size_16,color_FFFFFF,t_70#pic_center)

图1. 猴子眼睛中光感受器的分布

图2. 胶片颗粒

一种简单的实现泊松圆盘分布的方法是:(1)随机生成采样位置,如果随机生成的采样位置与已经选择过的距离小于一给定值,则丢弃它,至少采样区域满为止,采用这种方法可以创建一个查询表(Lookup Table);(2)还需要计算滤波器的值,该值描述了每个采样点与周围的像素点的关系。位置信息和滤波器的值存储在一个查询表中,这种简单的方法确实能产生很好的图像效果,但是要求有一个非常大的查询表。因此这里引入另外一种技术:抖动。

二. 随机采样(Stochastic Sampling

抖动技术也可以称在采样位置中加入一些噪声,它是随机采样的一种形式,是一种逼近泊松圆盘分布的技术。抖动技术又有很多种类型,这里主要介绍规格网格的抖动技术,这种技术能产生较好的实验结果并且很适用于图像渲染算法。抖动可以使得高频信号降低,但是降低的高频信号中的能量会出现在噪声中而不会消失,因此基本的光谱组合没有发生变化。与纯种的泊松圆盘分布技术相比,该技术可能会造成更多的噪声,而且可能会留下部分锯齿。

举个抖动的例子,计算时间抖动(Time Jitter)的效果,第n个样本抖动ζn的量,所以会在nT+ζn的位置采样,T表示采样周期,如图3所示,就是时间抖动的效果。可以采用不同的模型来表示抖动量ζn,比如用方差是σ2的高斯分布函数,增益量就可以为频率μ的函数,如下等式所示:

图3时间抖动

把一个像素看成是一个网格,或者由多个子像素(subpixel)网格构成的大网格,这样就是一个二维的抖动。噪声随机的加到X方向上的位置或者Y方向上的位置,X,Y方向相互独立,就相当于是两个一维的抖动构成的,要求使得每个采样点发生在某个像素网格范围内的随机位置上。如果已知道哪些采样点是可见的,则通过重构过滤器(Reconstruction Filter)对那些采样点的值进行处理。重构过滤器的实现方法是一个开放性的问题,最简单的重构过滤器是箱式滤波器(Box Filter):取多个采样点的平均值。也可以采用加权重构滤波器,这种情况下,滤波器是一个采样位置与周围像素相关的加权值。每个像素是附近采样点的值乘以加权值的总和,这些滤波器可以提前计算好保存在一个查询表中。

总结下随机采样的步骤:(1)加入随机抖动的采样样本;(2)重构过滤器重构该像素值。

三. 分布式光线追踪(Distributed Ray Tracing

3.1 分布式光线追踪的概念和作用

它不是在分布式系统上的光线追踪,而是一种基于随机、分布式、超采样的光线追踪方法,解释下这里面有几个关键词的意思,如图4所示:

(1)超采样,传统的光线追踪,是一个像素对应一条光线,而分布式光线追踪是一个像素多个采样点,所以一个像素就有多条光线,不限于图中所示的9条;

(2)随机性,其实图4表示分布式光线不太准确,因为几条光线都是均匀分布的,由于本人比较懒就不画新的图片演示了,分布式光线中说的几条光线是随机的分布在一个像素方格内。

传统的光线追踪方法能产生较严重的锯齿,使得渲染出来的图像并不是自己想要的。而且在真实世界中,产生的图像不并像计算机产生的世界那样完美,即真实世界中,几何模型的边界棱角可能是模糊的,阴影的显示也有一个过渡过程。基于这个需求,分布式光线追踪这种技术应运而生,它是一种尽可能逼近这种效果的技术。

图4 分布式光线追踪

计算机图形学尝试将一个真实的世界显示在一个视频显示器上,真实的世界是由无穷多个像素组成的,但是显示器的光栅显示有像素数量的限制,显示器上的每个像素只能覆盖场景中的某个区域,所以像素值必需是该区域的估计。传统的光线追踪方法,每个像素只有一条光线穿过,依靠它来获取真实的世界中值,这种方法很简单,但是不精确。相反,如果采用多条光线的话,这个效果就不言而喻了。

3.2 着色模型

场景上一个点的光照强度值用数学解析函数可以表示成发光函数(Illumination Function反射函数(Reflectance Function)的一个积分,要非常精确地计算这样一个积分,对于计算机图形应用来说是非常困难的。传统的光线追踪方法仅用一个光线去简化这个过程,例如,Phong光照模型,它是假设漫反射光是向所有方向均匀的发散,镜面反射光在反射方向是满强度,但是随着偏移的角度的cosine值呈现指数级减小,(参见文章《Phong光照模型》,有详细的介绍),将光源建模成单一的一个点,所以光线能从光源发散出去并以一条单一光线的形式射向平面。

分布式光线追踪能产生对上述的着色模型更好的估计,该想法是基于超采样的理论,不使用单一的光线来估计该积分,一个像素被超采样,使用那些采样点来估计一个更加精确的值。在实际的应用中,它解决了下面5个需求:

(1)       表面不光泽的情况,即模糊反射(Fuzzy Reflection)

(2)       模糊半透明效果(Fuzzy Translucency)

(3)       半影,或者说柔和阴影(Penumbras,soft shadows)

(4)       深度场(Depth of Field)

(5)       运动模糊效果

3.3 模糊反射

传统的光线追踪能实现完美的反射平面,反射平面会显得特别的清晰,但是在处理模糊反射或者部分反射上就显得不足。现实世界中更经常遇到的情况是,表面模糊的,只能模糊的反射出场景中的物体,这是由于平面的粗糙导致光发散造成的。

模糊反射的基本思想:模糊表面的效果是通过随机分布(动词)反射光线(名词)产生的,沿着反射光线方向一定范围内随机的发散多条光线,如图5所示,每条光线会得到一个值,最终取所有光线的平均值。如果使用区域性的光源即非点光源,可以产生镜面反射一样的强光区;如果由平面反射出的光线射中一个光源,该光源可以加上发光平面的镜面反射量,这能替换Phong模型的镜面反射量。

图5. 反射光线方向的多条光线

下面举个模糊反射的例子,如图6所示:

图6. (a)表示传统的光线追踪方法,反射边缘锐利;(b)采用了10条分布式光线;

(c)采用了20条分布式光线;(d)采用了50条分布式光线

3.4 模糊半透明

半透明的数学解析函数与着色函数的解析函数类似,但是用投射函数(Transmittance Function)来替换反射函数,投射的光成分包括环境光,漫反射光和镜面反射光。传统的方法比较擅长处理完全透明的平面,处理不完全透明的平面就显得不够真实(采用像素混合的方法,参见文章《像素相关的操作》),真实的半透明平面通常会发送一个在平面后面模糊的场景图片。

模糊半透明实现的基本思想:随机的向传统光线投射的方向投射多条光线,如图7所示,与模糊反射相类似,每条光线会计算出一个值,最终取这些值的平均值。

图7. 投射光线方向的多条光线

如图8所示,举几个模糊半透明的例子:

图8. (a)使用传统的光线追踪方法,得到非常清晰的半透明效果;(b)随机发布10条光线产生的效果;(c) 随机发布20条光线产生的效果

3.5 柔和阴影

在传统的光线追踪中的阴影是离散的,当着色一个点时,每个光源会确保是否它是可见的,如果光源是可见的,它就对那点的着色有贡献的。光源本身会被建模成一个单一的点,在距离很远的情况下这种模型是非常正确的,但是如果光源很近的话,就显得不够准确了,导致阴影的边缘非常的锐利。阴影在真实的世界里,过渡是很平缓的,从完全的阴影到半阴影的效果是逐渐进行的。

柔和阴影的基本思想:分布式光线追踪通过将光源建模成一个球来估计这样一个柔和的光源效果。阴影是通过由平面射向光源的光线来计算的,而半影则是通过分布式的发送前面出现阴影的光线来计算的。计算阴影时,发射的光线可以追踪到光源上的某个具体位置,而不仅仅只是光源的位置,阴影的分布可以根据投影面积和光源上不同的位置进行加权求值。射向每个区域的光线数也应该与来自于该区域光的能量成比例,即发射向一个区域的光线比例应该与在那个区域可见的光强度相等。

即分成两步:(1)先计算阴影;(2)阴影的边缘用分布式光线进一步进行处理。

如图9所示,使用柔和阴影的例子:

图9 (a)用传统的光线追踪的方法,产生的阴影; (b)使用10条分布式光线追踪的方法;(c) 使用10条分布式光线追踪的方法;(d) 使用10条分布式光线追踪的方法

3.6 深度场

眼睛到照相机都一个有限的镜头光圈,所以都有一个有限的深度场。在光学特别是摄影中,有深度场的概念,表示在一定范围内的物体的清晰的拍摄成一张图片,而在那个范围外的物体就显得很模糊,如图10所示,如果物体之间间隔太远或者太近就会由于无法聚焦而变的模糊。几乎所有的计算机图形渲染都采用的一种技术称为小孔模型,在这种模型下,几乎所有的对象都能完美的聚焦,不管距离的远近。有时候是希望有这种效果的,但是有时候为了精确的给光学系统建模,需要模拟深度场,使它显得更加真实。

图10 深度场

一个物距为s的点,在经过透镜以后只能精确的聚焦在一个点上,产生一个点图像,在像距在其它值上,它都是散焦的,形成类似于光圈的模糊点,通常把它设想成是一个圆。如果该圆足够小,可以与其它点区分开来,就显得是聚焦的,就能生成一张可接受的清晰图像。该圆圈的直径,随着与聚焦点的距离增加而增加,能与一个点区分开来的最大点圆圈尺寸就称为可接受的散光圈(Acceptable circle of confusion)或者称为散光圈。

一个对称透镜如图11所示,n表示光圈系数(f-number),它是是焦距F与光圈直径的比例,C指的是散光圈直径。一个物体在距离s处(即物距),经过透镜后,它的像距是 v,物距分别是DF,DN的点的像距分别是vF,vN,相对于像距v来说,它们都是模糊点。深度场是散光圈直径d来控制,如果模糊点的直径等于模糊圈C,则DOF近平面和远平面值就是DN,DF。由光学原理,可以推导出散光圈的大小C。

图11 散光圈

深度场的基本思想:相当于在图像的投影面和物体之间加上一块透镜,随机的发散一系列的光线,第一条光线未经过透镜处理,其它光线随机的发散到透镜上,以此来模拟透镜的深度场。

如图12所示,演示了两张关于小球深度场的例子。

图12 深度场图片

3.7 运动模糊效果

计算机中的动画效果是通过生成一个序列的静止图像,然后按照顺序播放它们,这是另外一种采样过程,但它是时域的不是空域的。

运动模糊效果:这种情况也可以使用分布式光线追踪方法来仿真模糊效果,在时域上和空域上都进行光线的随机分布,最后再将所有光线计算出来的值进行平均,得到相应的结果。

如图13所示,演示了模糊运动效果的例子:

图13. 小球的模糊运动

3.8 总结

图14. 分布式光线

图14就显示了分布式光线追踪方法中一条光线的流向图,这种方法能较好的实现上述所说的五种渲染效果。这里就不重复叙述了。

四. 参考

【1】      http://web.cs.wpi.edu/~matt/courses/cs563/talks/dist_ray/dist.html

【2】      http://en.wikipedia.org/wiki/Depth_of_field

【3】      Paper,Robert L. Cook等,“Distributed Ray Tracing

【4】      Paper,Robert L. Cook,“Stochastic Sampling in Computer Graphics

随机采样和分布式光线追踪相关推荐

  1. 拜占庭鲁棒随机聚合的分布式学习方法

    文章目录 拜占庭鲁棒随机聚合的分布式学习方法 介绍 分布式SGD 鲁棒分布式学习的RSA算法 l1l_1l1​-范数 RSA p范数 RSA 结论 原文链接:https://arxiv.org/abs ...

  2. Python-pcl 随机采样一致性算法

    RANSAC 随机采样一致性算法 RANSAC是一种随机参数估计算法.RANSAC从样本中随机抽选出一个样本子集,使用最小方差估计算法对这个子集计算模型参数,然后计算所有样本与该模型的偏差,在使用一个 ...

  3. 随机采样池化--S3Pool: Pooling with Stochastic Spatial Sampling

    S3Pool: Pooling with Stochastic Spatial Sampling CVPR2017 https://github.com/Shuangfei/s3pool 本文将常规池 ...

  4. 机器学习中的数据不平衡问题----通过随机采样比例大的类别使得训练集中大类的个数与小类相当,或者模型中加入惩罚项...

    机器学习中的数据不平衡问题 摘自:http://wap.sciencenet.cn/blogview.aspx?id=377102 最近碰到一个问题,其中的阳性数据比阴性数据少很多,这样的数据集在进行 ...

  5. ML之FE:数据随机抽样之利用pandas的sample函数对超大样本的数据集进行随机采样,并另存为csv文件

    ML之FE:数据随机抽样之利用pandas的sample函数对超大样本的数据集进行随机采样,并另存为csv文件 目录 数据随机抽样之利用pandas的sample函数对超大样本的数据集进行随机采样,并 ...

  6. 5.7 随机采样最小二乘法

    5.7 随机采样最小二乘法 如果万一出现差错,又难以检测出,则强影响点影响很大,此时可以采用一种随机方法,尽量避免差错带来的影响. 随机最小二乘法不采用所有测量数据,而是随机抽取部分测量数据,根据这些 ...

  7. 最小二乘法以及RANSAC(随机采样一致性)思想及实现

    线性回归–最小二乘法(Least Square Method) 线性回归: 什么是线性回归? 举个例子,某商品的利润在售价为2元.5元.10元时分别为4元.10元.20元, 我们很容易得出商品的利润与 ...

  8. 【python】随机采样的两种方法

    python中需要在一定区间内进行采样,或是对生成的数据进行采样,可以利用随机模块random.sample()函数或者numpy.random.choice()函数实现. 1.随机采样 如果需要对某 ...

  9. 设置随机种子之后,网络训练结果仍然不同的解决方法(针对随机采样的数据集)torch设置随机种子,num_worker对数据采样的影响。

    网络训练结果无法复现 设置随机种子 应该为torch, numpy,以及Python设置随机种子,并提高torch卷积精度. def set_seed(seed):random.seed(seed)n ...

最新文章

  1. 阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
  2. ZZULIOJ 1075: 聚餐人数统计
  3. MATLAB中如何忽略函数中前几个不需要的返回值而只取需要的返回值,例如:只取函数第二个返回值,而忽略第一个返回值
  4. 谷歌新旗舰Pixel 3让AI帮你接电话:你是谁?为什么来电?
  5. 【GNN框架系列】DGL第二讲:使用Deep Graph Library实现GNN进行链接预测
  6. CAD迷你看图常见使用问题与解答
  7. 线程---同步---快乐影院小案例
  8. 环境工程学(整理知识点)
  9. 您的Android版本不兼容,android – “你的设备与此版本不兼容”
  10. ubuntu 挂载U盘 NTFS
  11. 新华三:照耀城市的数字演进之路
  12. actor 模型原理 (一)
  13. 淘宝订单、API获取订单
  14. svn 禁止访问的问题
  15. SHELL对接国际验证码接口
  16. 项目案列:银行ATM存款机系统(笔记经典案列)
  17. 卢森堡无GDPR罚款,隐私专员称目的是改变文化
  18. Appium移动自动化
  19. 2023/2/13 ubuntu18.04版本无线与有线网络网络配适流程
  20. 最新转转交易猫闲鱼后台源码+带视频教程亲测

热门文章

  1. 显卡算力排行_RTX3090 时代最新GPU选购指南:哪款显卡配得上我的炼丹炉?
  2. 电子学:第010课——实验 9:时间与电容器
  3. 系统重装用户名与计算机名一致,win7刚重装系统 开机的用户名和密码怎么办-win7用户名,win7默认用户名是什么...
  4. WPF 视觉树和逻辑树区别,以及其子节点的遍历过程。
  5. VB6银联读卡之旅(二)__55域获取流程及相关注意
  6. 7段数码管和打印机接口
  7. Kotlin协程核心库分析-5 Job异常处理器注意点
  8. python运行文件时说系统找不到指定文件-python找不到指定文件
  9. 关于校园招聘 - 秋招和春招
  10. Windows常用热键