chapter 9:电解质
文章翻译
清晰的材料,如水、玻璃和钻石都是电解质,当一束明亮的光线击中他们,光线会分裂成反射光线和折射(透射)光线。我们会随机的在反射和透射中选择,并且每次光线与电解质交互只会产生其中一种。
最难解决的是透射光线,如果有透射光线,我通常让所有光线透射。对于这个项目来说,我尝试放置两个玻璃球在我们的视野中,然后我得到这张图片(我还没有告诉你怎么做对或做错,一会说):
这是对的吗?在现实生活中,这个玻璃球看起来很奇怪,然而这是错误的,世界应该颠倒且没有奇怪黑色的东西。我在图片中直接打印出了光线,显然这是错误的。
Snell 的法则将透射描述为: n sin(theta) = n’ sin(theta’)
n 和 n’ 是透射系数(通常来说,空气是1,玻璃在1.3-1.7内,钻石是2.4),几何上看是这样的:
我们的实际问题是,当光线从低进入高折射系数的物质,Snell 法则没有真实解,因此没有折射的可能性,这里的光线全部反射,因为在实践中,通常是在物体实体内部,这被称为 全反射。这就是为什么,当你沉浸在水中,水和空气的边界有时候看起来像一面完美的镜子,折射的代码比反射的代码稍微复杂一点:
电解质材料总是尽可能的发生折射:
Attenuation 系数总是1——玻璃表面不吸收任何光线,attenuation = vec3(1.0, 1.0, 0.0) 将会关闭蓝色通道,这是很难发现的颜色错误,这仅让颜色发生转变。尝试一下这个系数,并把它改为 vec3(1.0, 1.0, 1.0) 来看一下二者的不同:
如果我们尝试这些参数:
我们可以得到:
(读者 Becker 指出当应有反射光线时,函数返回 false,因此没有发生反射,他是对的,这也是为什么在上面的图片中没有显示。我会留下这个问题而非修正它,因为这是一个非常有趣的有主要错误的例子,能留下一张看起来合理、真实的图片。这些隐藏的错误是最难发现的错误,因为我们人类不擅长发现我们视觉看见上的错误)
真实的玻璃有着随着角度而变化的折射率——从一个陡峭的角度看窗户,它就变成了一面镜子。有一串难看的公式能解释这个现象,但是几乎每个人都使用 Christophe Schlick 提出来的那个简单的,且十分近似的多项式来替代:
给出我们玻璃材质的所有代码:
(注意: "scattered =" 在上述代码的首次出现不是必须的,很快就会在后面被重写,不会影响结果,只是一个声明的错误)
电解质的一个有趣而简单的技巧是,如果你使用负半径,几何形体不会受影响,但是表面法向量是指向内的,因此它可以作为气泡制作一个空心玻璃球体:
这可以得到:
小结
电解质材料这块有点不好理解,来简单捋一下