实现施里克近似的问题



因此,我正在努力为射线示踪剂创建折射玻璃球,并根据该网站上的另一个用户的建议来实现Schlick的菲利克折射近似值,以实现Schlick的近似值。使我的玻璃看起来更现实。但是,在实施后,我的玻璃看起来仍然很乏味。外观几乎没有任何差异,除了有一些镜像反射,但看起来好像我将镜面与折射球人为地结合在一起。我希望Stack Overflow有一种简便的方法可以上传图片,以便我可以向您展示我的意思。

我在下面发布了我的代码,向您展示了我实现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);
    }

这是问题:float costheta = stvector3 :: dot(h,v);要找到使用Schlick的近似值从玻璃重新发出的光量,您需要使用折射角而不是入射角。当光进入玻璃时,使用入射角。

相关内容

  • 没有找到相关文章

最新更新