Итак, я работаю над созданием преломляющих стеклянных сфер для трассировщика лучей, который я создаю, и пытаюсь реализовать приближение Шлика для преломления Френеля в соответствии с предложением другого пользователя на этом сайте, чтобы мое стекло выглядело более реалистично. Однако после его реализации мой стакан все еще выглядит довольно тусклым. Во внешнем виде почти нет никакой разницы, за исключением некоторого зеркального отражения, но это выглядит так, как будто я искусственно объединил зеркальную сферу с преломляющей сферой. Я бы хотел, чтобы у переполнения стека был простой способ загрузки изображений, чтобы я мог показать вам, что я имею в виду.
Я разместил свой код ниже, чтобы показать вам часть, в которой я реализую приближение Шлика. После вычисления приближения я делаю два рекурсивных вызова для трассировки лучей сцены: один для отраженного луча и один для преломленного луча.
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);
}