Это соответствующий код для рефракции. Я получаю странные результаты, когда меняю показатель преломления. В идеале сфера должна показывать искаженную фиолетовую сферу и фон из-за преломления, но вместо этого она выглядит действительно как красная сфера внутри прозрачной.
if(depth < MaxRecursion) {
if(shape[pos]->transparent() == 1) {
vec normal = N;
// etam = index or refrac of medium, etao = index of outside;
float eta, etao = 1.0, etam = 1.1
float cosi = dot(N, unit_vector(r.dir());
if(cosi < 0.0) {
cosi = -cosi;
}
else {
normal = -normal;
swap(etao, etam);
}
eta = etao/etam;
float c2 = 1.0 - eta*eta*(1.0 - cosi * cosi);
if(c2 > 0.0) {
vec dir = unit_vector(eta*unit_vector(r.dir()) - (eta*cosi -
sqrtf(c2))*normal);
ray refraction(r.p_at_par(t_near) + normal*1e-4, dir);
total += color(refraction, shape, lighting, depth + 1);
// color function is the current function
}
else { // total internal reflection
ray reflect = reflection(unit_vector(r.dir()), normal, r.p_at_par(t_near));
total += color(reflect, shape, lighting, depth + 1);
}
}
}
и для более высоких показателей преломления я получаю полностью белую сферу (etam = 1.9
). Я знаю, что ошибка заключается только в этой части кода, потому что все остальное работает без кода преломления ( то есть отражение, тень и т. д. c.)