RayTracing, код преломления дает странные результаты - PullRequest
0 голосов
/ 10 марта 2020

Это соответствующий код для рефракции. Я получаю странные результаты, когда меняю показатель преломления. В идеале сфера должна показывать искаженную фиолетовую сферу и фон из-за преломления, но вместо этого она выглядит действительно как красная сфера внутри прозрачной.

enter image description here

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.)

enter image description here

...