这是实施比尔定律的正确方法吗?


11

当我实施比尔定律(通过物体的距离吸收颜色)时,由于某种原因,它看起来永远不会很好。

当我在对象后面有颜色时,我将像这样计算调整后的颜色:

const vec3 c_absorb = vec3(0.2,1.8,1.8);
vec3 absorb = exp(-c_absorb * (distanceInObject));
behindColor *= absorb;

这将使我看起来像这样(请注意一点折射): 在此处输入图片说明

这里没有折射: 在此处输入图片说明

请注意,此处将其实现为着色器玩具。

这满足了比尔定律的作用的描述,但是与以下镜头相比,它看起来不是很好: 在此处输入图片说明

除了高光,我正在努力找出差异。难道仅仅是我的几何形状太简单而无法很好地展示出来吗?还是我执行不正确?


2
但是,您正在将立方体与更复杂的网格进行比较。为什么不复制相同的场景?Susan模型很容易获得。
巴特2015年

在shadertoy实现中并不是那么容易!(:
Alan Wolfe

2
您的立方体对我来说看起来是正确的:靠近边缘时,变得更加透明。如果您可以完全吹制Suzanne,则球体至少应能更好地逼近其他图片。
yuriks 2015年

1
我无法将折射与衰减分开。您可以渲染IOR = 1.0的多维数据集吗?
imallett 2015年

1
@AlanWolfe您的IOR = 1渲染看起来完全符合我的预期,并且我略过了shadertoy impl,它看起来不错。
malletlet

Answers:


12

您的图像肯定看起来不正确,并且看来光线在穿过网格时,您没有正确计算光线的内部路径。从它的外观来看,我要说的是您正在计算视线首先进入立方体的点与它首先撞击内壁的点之间的距离,并将其用作您的吸收距离。这基本上是假设光线在第一次撞击玻璃时总是会从玻璃中射出,这是一个很差的假设。

实际上,当光从空气进入玻璃时,通常不会立即离开玻璃。这是因为当光线入射到玻璃/空气界面时,会发生称为全内反射(TIR)的现象。当光从具有较高折射率(IOR)的介质传播到具有较低IOR的介质时,就会发生TIR,这恰好是光入射到玻璃物体的内壁时发生的情况。维基百科的这张图片很好地展示了它发生时的样子:

全内反射

从根本上讲,这意味着如果光线以浅角度照射,光线将完全从介质内部反射出去。为了解决这个问题,您需要评估菲涅耳方程每当您的光线碰到玻璃/空气界面(也就是网格的内表面)时。菲涅耳方程将告诉您反射光与折射光的比率,而在TIR情况下为1。然后,您可以计算适当的反射和折射光方向,并继续跟踪穿过介质或介质外部的光路。如果您假设一个具有均匀散射系数的简单凸网格,那么用于比尔定律的距离将是退出介质之前所有内部路径长度的总和。这是具有您的散射系数和IOR为1.526(苏打石灰玻璃)的立方体的外观,该立方体使用我自己的路径跟踪器进行了渲染,该路径跟踪器同时考虑了内部和外部反射和折射:

路径追踪的玻璃立方体

最终,内部反射和折射是使玻璃看起来像玻璃的主要部分。正如您已经发现的那样,简单的近似实际上并不能削减它。如果添加多个网格和/或非凸网格,情况将变得更加糟糕,因为您不仅必须考虑内部反射,还必须考虑离开介质并在不同点进入介质的光线。


1
Here is what a cube looks like (...) using my own path tracer. 您是否碰巧将它开源了?
wip

2
还没有。我正计划完成和发布此特定变体,以及有关玻璃渲染的博客文章,但已经有一段时间了。
MJP 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.