阿昌学习《RayTraing in one week》 (九)
第九章
前两章加入了金属材质和漫反射材质,这一章再加入一个“电解质材质”,简单点说就是水呀,玻璃呀,钻石呀这些都是电解质材质(有的翻译叫绝缘体材质),实质上就是光线在击中这个材质的时候既有折射又有反射,而书里采用方式是一跳光线击中后,随机产生一条反射或者折射光线。
因为调试过程中折射部分比较麻烦,所以先将所有的光线只发生折射,然后在两个透明的玻璃球。



一些常见的折射率:空气为1.0,玻璃为1.3-1.7,钻石为2.4。
折射部分的光线R` 可以分解为垂直和水平的两个向量,这样就可以把上边的公式变为:
n / n’ * sin(theta) = sin(theta’)
这里入射夹角就是与法向量的夹角,入射光线是已知的,折射率一般也是给定的。
所以呢,就可以直接求得theta`的度数,再根据点乘公式,可以计算出折射光线了。
直接用代码来展示一下:
记得看一下里面的备注!!!一定要细看

写一个电解质材质类(这里注意一下104行,书中写的是(1,1,0),我写的是(1,1,1)这里输出的图是有区别的后):

写好后,我们在主函数修改一下球的参数:

main只修改了小球的参数
接下来我介绍一下,输出的情况:
第一种:使用v和(1,1,0)的时候

第二种:使用uv和(1,1,0)的时候

第三种:使用uv和(1,1,1)的时候

其实我们现实中看到的玻璃是很有趣的,当你以一个很小的角度去观察玻璃的时候,他会比较像一面镜子,这个时候就要引入 —— 菲尼尔效应。
关于菲尼尔方程的介绍:菲涅尔方程(Fresnel Equation) - 王江荣的文章 - 知乎 https://zhuanlan.zhihu.com/p/375746359
他这篇文章讲解的还可以,我比较理解一些。

那么改写一下之前的电解质材质类:

在主函数中添加一个新的球:
这里要半径是负数可以得到一个法线相反的球,联想一下就是得到了一个中间是空的一个气泡般的球体


这样就基本介绍完了物体相关的基础内容,接下来我们要改变一样很有趣的东西,让我们的摄像机动起来。

