因此,我正在为我正在构建的光线追踪器创建折射玻璃球体,并尝试根据本网站另一位用户的建议实现 Schlick 的菲涅尔折射近似值,以使我的玻璃看起来更逼真。但是在实施之后,我的玻璃看起来仍然很平淡。除了有一些镜面反射外,外观几乎没有任何区别,但它看起来有点像我人为地将镜面球体与折射球体组合在一起。我希望堆栈溢出有一种简单的方法来上传图片,这样我就可以告诉你我的意思。
我在下面发布了我的代码,以向您展示我实现 Schlick 近似的部分。在计算出近似值后,我进行了两次递归调用来对场景进行光线追踪:一次用于反射光线,一次用于折射光线。
if (hit->mat->IsRefractive())
{
temp.Refract(hit, total2);
total2++;
float Ro = powf(((1.8-1.0)/(1.8+1.0)),2.0f); //Refractive index is 1.8
STVector3 V = myray.GetD()/myray.GetD().Length(); //Normalized view vector
STVector3 L = AllLights[0]->GetDirection(hit->point); // Light vector
L = L/L.Length(); //Normalize light vector
STVector3 H = (V+L);
H = H/H.Length();
float costheta = STVector3::Dot(H, V);
float F = Ro + (1.0f - Ro)*powf((1.0f-costheta), 5);
STColor3f Krf = STColor3f(F, F, F);
STColor3f Kr2 = STColor3f(1.0-F, 1.0-F, 1.0-F);
Ray temp2(myray.GetE(), myray.GetEnd());
temp2.Reflect(hit);
result += Krf*RayTrace(temp2, total, total2);
result += Kr2*RayTrace(temp, total, total2);
}