一、BSSRDF的定义

BSSRDF描述的是次表面中光的传播。考虑次表面中光的传播的话,光线离开次表面时的点(Po)和光线进入次表面时的点(Pi)不再是同一位置。如下方图示:

BSSRDF的定义式:

BSSRDF对应的渲染方程的一般形式:

二、BSSRDF的建模与近似

在给定po、wo、pi、wi时,总不能根据BSSRDF的定义式来求解S(po, wo, pi, wi)吧。
最直接的方法是建立各种BSSRDF模型来近似模拟真实的物理情况。

书上提供了这个近似模型:


这个近似去除了位置(po, pi)和方向(wi,wo)之间的耦合。
其中各个分量的具体含义,原文截图如下:

三个分量,一个一个求解呗:

接下来,只剩下Sp分量啦,不过这个也是最为复杂的。

三、Sp(po, pi)

对Sp进行进一步近似和简化:

Sp(po, pi)表示Sp的值由po、pi的位置决定。
Sr(||po-pi||)表示Sr的值只由po、pi之间的距离决定。也就是说,到po相同距离的所有的pi对应的Sr值时相同的,这些所有的pi在一个以po为球心,||po-pi||为半径的球面上,“Sr”中的“r”表示的就是“radial”。称“Sr”为“半径分量”好了。用Sr近似Sp,简化了很多啊,有木有?

“半径分量Sr”的值在各种材料属性都确定的情况下,只和“半径r”有关。但是,不同的材料对应着不同的材料属性。所以,考虑“半径分量Sr”的一般形式:

尼玛,这个形式也忒复杂了吧,必须简化。

到目前为止,“半径分量Sr”已经简化到只和(rho, r)相关。接下来,怎么办呢?

书上讲到:

即:“半径分量Sr”的具体值存放在一个叫做“BSSRDFTable”的表中。
根据(rho, r)到“BSSRDFTable”的表中获取对应的“半径分量Sr”的值。

原来早就算好了所有的“半径分量Sr”的值,来来回回各种简化,最后原来是“查表”哈!

“profile”这个表里存放的是先前计算好的“半径分量Sr”的值,相当于是对Sr进行采样之后的采样点。

现在要用这个表里的数据,可不能只是简单“读取出来直接使用吧”。
应该怎么办?
“采样”对应“重构”嘛。
“profile”表中保存的是“半径分量Sr”的采样点,使用时当然得对采样点做相应的“重构”。

书上采样的重构方式是:双三次张量插值(bi-cubic tensor interpolation)。

什么意思?

先分别对rho_sample和r_sample进行双三次(样条)插值求得各自的权系数,然后求权系数的张量积,然后根据权系数的张量积对对应的“半径分量Sr”的值进行累加。

关于rho_sample和r_sample的“样条插值”,下图假设r=0.5, rho=0.2:

书上计算这个插值的函数是CatmullRomWeights()。

bool CatmullRomWeights(int size, const Float *nodes, Float x, int *offset,Float *weights) {// Return _false_ if _x_ is out of boundsif (!(x >= nodes[0] && x <= nodes[size - 1])) return false;// Search for the interval _idx_ containing _x_int idx = FindInterval(size, [&](int i) { return nodes[i] <= x; });*offset = idx - 1;Float x0 = nodes[idx], x1 = nodes[idx + 1];// Compute the $t$ parameter and powersFloat t = (x - x0) / (x1 - x0), t2 = t * t, t3 = t2 * t;// Compute initial node weights $w_1$ and $w_2$weights[1] = 2 * t3 - 3 * t2 + 1;weights[2] = -2 * t3 + 3 * t2;// Compute first node weight $w_0$if (idx > 0) {Float w0 = (t3 - 2 * t2 + t) * (x1 - x0) / (x1 - nodes[idx - 1]);weights[0] = -w0;weights[2] += w0;} else {Float w0 = t3 - 2 * t2 + t;weights[0] = 0;weights[1] -= w0;weights[2] += w0;}// Compute last node weight $w_3$if (idx + 2 < size) {Float w3 = (t3 - t2) * (x1 - x0) / (nodes[idx + 2] - x0);weights[1] -= w3;weights[3] = w3;} else {Float w3 = t3 - t2;weights[1] -= w3;weights[2] += w3;weights[3] = 0;}return true;
}

(原理在8.6.1章节,此处略去)

关于这行代码,再补充说明一下:

        // Cancel marginal PDF factor from tabulated BSSRDF profileif (rOptical != 0) sr /= 2 * Pi * rOptical;

根据式子“11.9”,咱的目的是求解具体点pi对应的Sp,但是根据||po-pi||从Sr表格中查找出来的是“以po为圆心,||po-pi||为半径的po处surface的切平面上一个圆周”对应的Sr。所以,针对单个点pi的Sr,需要在查找结果的基础上除以“周长”。

归根到底是:简化,近似,查表

流水账式的记录,差不多就是这样~

Q132:PBRT-V3,BSSRDF(双向散射表面反射分布函数)(5.6.2章节、11.4章节)相关推荐

  1. PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现

    PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现 BRDF简介 再介绍BRDF之前我们要引入渲染方程这个东西: 其中L表示辐射率,其公式为: 它表示了一个拥有辐射强度Φ的 ...

  2. 图形学理论知识 BRDF 双向反射分布函数

    图形学理论知识 BRDF 双向反射分布函数 Bidirectional Reflectance Distribution Function BRDF理论 BRDF表示的是双向反射分布函数(Bidire ...

  3. sBRDF空间双向反射分布函数完全解析

    SBRDF空间双向反射分布函数解析 声明:本文大部分内容基于Ph.D David K. McAllister的博士论文<A GENERALIZED SURFACE APPEARANCE REPR ...

  4. 计算机图形学基础:双向反射分布函数 BRDF

    文章目录 光照.照明(Illumination) 预备知识 球面坐标(Spherical Coordinate) 立体角(Solid Angle) 投影面积(Foreshortened Area) 光 ...

  5. 浅谈表面反射——波动光学篇

    Radiometric Definitions 首先让我们来回忆一下辐射度量学中关于irradiance和radiance的定义: 我们在这里定义光源(source)在x-z平面,因此入射光就可以只用 ...

  6. 图形学笔记(十三)光线追踪3——双向反射分布函数BRDF(反射方程、递归方程)、辐射度量学基础radiometry、立体角、Radiant Energy、Flux、Irrdiance、Radiance

    图形学笔记(十二)光线追踪2--使用AABB包围盒加速光线追踪.空间划分(八叉树.KD树.BSP树).物体划分(BVH加速结构).光线与物体求交 图形学笔记(十四)光线追踪4--蒙特卡洛(Monte ...

  7. 光的散射、反射、漫反射的区别

    散射(scattering)是指由传播介质的不均匀性引起的光线向四周射去的现象.如一束光通过稀释后的牛奶后为粉红色,而从侧面和上面看,是浅蓝色. 反射:声波.光波或其他电磁波遇到别的媒质分界面而部分仍 ...

  8. Q136:PBRT-V3,双向路径追踪(Bidirectional Path Tracing)(16.3章节)

    之前了解了路径追踪,参考如下: Q124:PBRT-V3,"路径追踪"积分器(14.5章节) 接下来,先回忆一下Path Tracing,然后具体了解Bidirectional P ...

  9. 我的Substance Designer 学习笔记02-PBR材质学习理解

    首先定义PBR:Physics-based rendering,基于物理的渲染. 由来.2012年迪士尼公司在技术论坛发布的文章,讲述自己作品的制作流程. 2014年被某大佬提出简化版本的制作流程.优 ...

最新文章

  1. 40个精美绝伦的国外网站设计作品范例(下)
  2. 和为S的连续正数序列(双指针详解)
  3. Linux下c语言实现通讯录,学生通讯录管理系统linux下C语言
  4. MyBatis插件开发:简单分页插件
  5. 华为交换机密码重置(在S5720系列上验证)
  6. 工商银行计算机社招笔试题,2019中国工商银行招聘面试试题及答案(一)
  7. (毕业设计资料)基于单片机51单片机智能药盒控制系统设计
  8. 论window和Linux之长短
  9. 世界主要粮食作物和经济作物的生产及其分布
  10. 计算机二级考试python考试大纲
  11. 计算机网络路由器的配置连接不上,路由器安装设置好后电脑还是不能上网解决办法...
  12. 【废了-准备删除01】渗透测试靶机搭建——基于WAMP的drupal7.x管理系统
  13. vue检测文本域字数变化
  14. 得益乳业 × 奇点云 | 在线化业务GMV增长9倍是怎样炼成的?
  15. Activiti工作流会签一 部署流程
  16. spring中<tx:annotation-driven>标签转为注解@EnableTransactionManagement
  17. 【声纹识别】 EER
  18. 硬盘变为RAW格式,数据还能恢复吗?
  19. 深度学习之图像分类(十九)-- Bottleneck Transformer(BoTNet)网络详解
  20. 【论文阅读】An Analysis of Scale Invariance in Object Detection – SNIP

热门文章

  1. centos一键安装包无法创建vhost
  2. NoSQL之【MongoDB】学习(二):DML和查询操作说明
  3. OSPF(Open Shortest Path First)开放式最短路径优先协议05
  4. 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)
  5. 【React】设计高质量的React组件
  6. 【React】JSX
  7. Tensor的合并与分割
  8. Ubuntu安装sqllite3并使用
  9. 【信息学奥赛一本通 提高组】第一章 贪心算法
  10. Leetcode93. 复原地址