Проблемы реализации приближения Шлика

Итак, я работаю над созданием преломляющих стеклянных сфер для трассировщика лучей, который я создаю, и пытаюсь реализовать приближение Шлика для преломления Френеля в соответствии с предложением другого пользователя на этом сайте, чтобы мое стекло выглядело более реалистично. Однако после его реализации мой стакан все еще выглядит довольно тусклым. Во внешнем виде почти нет никакой разницы, за исключением некоторого зеркального отражения, но это выглядит так, как будто я искусственно объединил зеркальную сферу с преломляющей сферой. Я бы хотел, чтобы у переполнения стека был простой способ загрузки изображений, чтобы я мог показать вам, что я имею в виду.

Я разместил свой код ниже, чтобы показать вам часть, в которой я реализую приближение Шлика. После вычисления приближения я делаю два рекурсивных вызова для трассировки лучей сцены: один для отраженного луча и один для преломленного луча.

    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);
    }

person user1855952    schedule 26.12.2012    source источник
comment
А в чем вопрос?   -  person Julio    schedule 27.12.2012
comment
Приближение Шлика, кажется, не имеет заметного эффекта, и мне интересно, правильно ли я его реализовал. Если нет, что мне нужно изменить, и если да, то могут ли быть какие-либо другие факторы, объясняющие, почему эффект в лучшем случае минимален?   -  person user1855952    schedule 27.12.2012


Ответы (1)


Вот в чем проблема: float costheta = STVector3::Dot(H, V); Чтобы найти количество света, которое повторно выходит из стекла, используя приближение Шлика, вам нужно использовать угол преломления, а не угол падения. Когда свет попадает на стекло, используйте угол падения.

person Phil Marlow    schedule 10.08.2020