PBRT-V3中是用3d grids来表示非均匀介质的。

一、非均匀介质的表示

之前做的笔记截图如下:


接下来关于“密度”和“sigma_t”的理解就是个人YY啦!

假设每个小正方体中最多可以装64个粒子。
那么,小正方体中保存的密度值=该小正方体中装的粒子数目/64。
比如,小正方体中只装了32个粒子,则对应的密度为0.5。

GridDensityMedium类中的成员变量sigma_t保存的是一个基准值。什么是“基准值”呢?即“光线打中粒子时,Medium对光线能量的衰减系数“。

比如:
假设某Medium中小正方体存放的密度值最大为0.75,当光线打中某个小正方体时,粒子被打中的最大概率为0.75。
那么,对应的sigma_t_max=sigma_t*0.75。
(举这个例子的原因是:后面需要用到sigma_t_max)

二、非均匀介质的采样

Woodcock提供了一种叫做“delta tracking ”的方法来对非均匀介质进行采样。示意图如下:

前面提到小正方体中不是没有装满粒子嘛?
delta tracking的第一步:将所有小正方体都“装满”粒子,将“非均匀介质”转换成“均匀介质”。
(如上图红色小球表示。)
后续则可以按照“均匀介质”的处理方式来处理。
只是要考虑一个概率问题。毕竟光线只有撞击到蓝色粒子时才是“有效”的,需要考虑的概率问题:就是光线撞击到某小正方体时,小正方体中蓝色粒子被撞击到的概率。
只要蓝色粒子被撞击到,就可当做“均匀介质”来处理:主要是求衰减系数beta_medium。
参考:Q129:PBRT-V3,均匀介质的采样(15.2.1章节)
而且,非均匀介质中是不考虑R、G、B各个方向的分量的,所以求解更为简单:
beta=beta_medium=sigma_s/sigma_t;
如果光线没有撞击到蓝色粒子,那么beta=beta_surface=1,即撞击点不在Medium中,在Surface上。

delta tracking接下来具体怎么做呢?

1,用一个bounding box将整个Medium包起来,光线撞击box得到两个点t_min、t_max。

2,对Medium进行采样,

从t_min开始,按照均匀介质中的标准指数步长进行采样。注意,这里的sigma_t_max=sigma_t*density_max。
假设desity_max=0.75,单个小正方体中最多可以装64个粒子。光线撞击到的某个小正方体对应的密度值是0.5,
此处如果使用的参数是sigma_t,那么该小正方体中粒子被撞击的概率=0.5;
此处如果使用过的参数是sigma_t_max(即sigma_t*0.75),那么该小正方体中粒子被撞击的概率=density/density_max=0.5/0.75;

3,对于每一采样点t_s,先得到对应的坐标点,然后根据坐标点计算得到其对应的小正方体,从而得到该小正方体的密度值,然后根据density_max计算得到该小正方体中粒子被撞击的概率p_s。
在程序中怎么实现某件事情可能发生可能不发生呢?怎么按照一定概率来执行某段代码呢?
引入一个0到1之间的随机数r。
如果p_s小于r,则执行某段代码;反之,不执行。

4,某粒子被撞中,此处即为有效采样点,即为撞击点,说明“采样点在Medium中”。保存此处的MediumInteraction信息。

5,反之,说明当前采样点t_s无效,继续迭代,产生新的采样点,重复“步骤3”。

6,若t_s>t_max,说明采样点已经离开Medium,说明撞击点不在Medium中(即在Surface上),返回beta=beta_surface=1。

相关代码截图:

三、非均匀介质的透明度(Transmittance)

关于透明度Tr的值:撞到蓝色粒子时,Tr=0;没有撞到蓝色粒子时,Tr=1。
前面我们已经知道撞到蓝色粒子的概率=被撞击的小正方体中的密度值density除以最大密度值density_max,即density/density_max。
那么,每次撞击小正方体(每次采样)时,对应的Tr的期望值E(Tr)=(density/density_max)*0+(1-density/density_max)*1=1-density/density_max

所以,非均匀介质最终的透明度等于介质所有采样点对应的透明度的期望值的累积(不用考虑是否撞击到蓝色粒子,计算的是透明度的期望值)。

因为E(Tr)=1-density/density_max<1,采样过程中,透明度Tr不断累乘,所以Tr的值会越来越小。
当小到某个阀值时,可以考虑用Russian Roulette终止采样。

相关代码截图如下:

Q130:PBRT-V3,非均匀介质的采样(11.3.3章节、15.2.2章节)相关推荐

  1. 人人商城v3.28.41修复11月8日微信登录接口,公众号和小程序同步修复

    人人商城v3.28.41修复11月8日微信登录接口,公众号和小程序同步修复 独家修复,可二开.可封装原生APP

  2. 编译protobuf-3.11.4 错误: aclocal-1.15: command not found的解决办法

    操作系统:kylinV10 protobuf版本:3.11.4 当编译protobuf时,执行以下命令: ./configure --prefix=$LEAN/protobuf3.11.4 出现以下错 ...

  3. python 整数输出 d f_如何将数字(10,11,12,13,14,15)分配给Python 3中的字母(A,B,C,D,E,F)?...

    您可以在代码中添加更多行来执行此操作: 首先创建两个带有字符的列表,一个带有要映射的整数,然后从那些创建dict: list_1=["A","B"," ...

  4. sql查询前10条、第11条到第15条数据

    SQL查询10条数据 查询前10条数据 查询第11条到第15条数据 查询前10条数据 MySQL.PostgreSQL使用limit select * from 表名 order by id(主键)l ...

  5. 二年级课程表(4月11日-4月15日)

    二年级课程表(4月11日-4月15日) 时间 周一 周二 周三 周四 周五 9:00-9:25 语文(说文解字) 数学(口诀求商) 语文(口语交际) 数学(应用除法) 语文(古诗诵读) 9:30-9: ...

  6. 一年级课程表(4月11日-4月15日)

    一年级课程表(4月11日-4月15日) 时间 周一 周二 周三 周四 周五 9:00-9:25 语文(课文) 数学(复习巩固) 语文(课文) 数学(复习巩固) 语文(语文园地) 9:30-9:40 眼 ...

  7. 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19

    题目描述: 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和. 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19 输入描述: 输入一个int ...

  8. 如果不大于指定整数n的3个素数之和仍为素数,则把这3个素数称为一个基于n的全素组。例如对于n=15,素数3,5,11之和3+5+11=17为素数,则3,5,11 称为一个基于15的全素组。定义所有基于

    全素组 题目 :如果不大于指定整数n的3个素数之和仍为素数,则把这3个素数称为一个基于n的全素组.例如对于n=15,素数3,5,11之和3+5+11=17为素数,则3,5,11 称为一个基于15的全素 ...

  9. 分享Silverlight/WPF/Windows Phone一周学习导读(4月11日-4月15日)

    历时一周的MIX11结束了,一周里微软带给Web开发人员一个又一个惊喜.特别是Silverlight以及Windows Phone 7开发人员,相信Silverlight 5 Beta的推出和Mang ...

最新文章

  1. Scrum卡片层次图
  2. Ubuntu(Linux) 下 unzip 命令使用详解
  3. Linux vi格式化文件命令
  4. JDK,JRE,JVM,JIT
  5. ajax渲染后的点击事件,在ajax调用后渲染“喜欢”按钮
  6. alertdialog android api 11,android – 设备api级别11的DialogFragments
  7. 2019快手内容报告重磅发布:日活突破3亿 点赞量超3500亿
  8. sql_action
  9. 软件静态测试qac,Helix QAC — 软件静态测试工具
  10. 10 个最佳 GIS 软件应用程序
  11. 网页星号点号密码查看最简方法
  12. 压缩或解压文件出现循环冗余检查的解决办法
  13. 逃脱只会部署集群系列 —— jenkins和gitlab的部署联动推送
  14. Python学习小组课程P2-Python基础(2)文件操作
  15. java 实现ps功能_JS实现在线ps功能详解
  16. 流程图软件最新排名,一分钟了解画流程图用什么软件
  17. VS2019 无法登录 许可证已过期 无法下载许可证
  18. DTV_SI 汇总 兼谈LCN
  19. 发热门诊医疗服务监测数据上报系统
  20. [附源码]java毕业设计基于JavaWeb生鲜O2O订购平台

热门文章

  1. Java Script学习 6(转)
  2. 【以太坊开发】发币指南--进阶篇
  3. 泰斯花粉阻隔剂 怎么使用
  4. 软件测试 : 第5次作业 -- 基于Jmeter的 性能测试
  5. load和loads的区别
  6. PYTHON博客记录0602
  7. Linked List Cycle | ||
  8. Select的onchange事件
  9. Welcome to NHibernate
  10. 剑指Offer 64 求1+2+...+n