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

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

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


那会给我看起来像这样的东西(请注意一点折射):


这里它没有折射:


请注意,这里是作为着色器玩具实现的。

符合比尔定律的描述,但没有看起来不太好,与以下镜头相比不是很好:


除了镜面高光之外,我正在尝试找出差异。难道仅仅是我的几何形状太简单而无法很好地展示出来吗?还是我实施不正确?

评论

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

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

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

我无法将折射与衰减分开。您可以使用IOR = 1.0渲染多维数据集吗?

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

#1 楼

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

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



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



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

评论


$ \ begingroup $
这是使用我自己的路径跟踪器的多维数据集(...)。您是否偶然将它开源了?
$ \ endgroup $
– wip
2015年9月3日在2:53



$ \ begingroup $
还没有。我正计划完成并发布此特定变体,以及有关玻璃渲染的博客文章,但已经有一段时间了。
$ \ endgroup $
– MJP
2015年9月3日,下午4:27