Graphics 实施Schlick'的问题;s近似

Graphics 实施Schlick'的问题;s近似,graphics,3d,rendering,raytracing,fresnel,Graphics,3d,Rendering,Raytracing,Fresnel,因此,我正在为我正在构建的光线跟踪器创建折射玻璃球体,并试图根据该网站上另一位用户的建议,实现Schlick对菲涅耳折射的近似,以使我的玻璃看起来更逼真。然而,在实施之后,我的眼镜看起来仍然很暗淡。在外观上几乎没有什么不同,除了有一些镜面反射,但它看起来有点像我人工合成了一个镜面球体和一个折射球体。我希望堆栈溢出有一个简单的方式上传图片,这样我可以告诉你我的意思 我在下面发布了我的代码,向您展示了我实现Schlick近似的部分。计算近似值后,我对场景进行两次递归调用:一个用于反射光线,另一个用于

因此,我正在为我正在构建的光线跟踪器创建折射玻璃球体,并试图根据该网站上另一位用户的建议,实现Schlick对菲涅耳折射的近似,以使我的玻璃看起来更逼真。然而,在实施之后,我的眼镜看起来仍然很暗淡。在外观上几乎没有什么不同,除了有一些镜面反射,但它看起来有点像我人工合成了一个镜面球体和一个折射球体。我希望堆栈溢出有一个简单的方式上传图片,这样我可以告诉你我的意思

我在下面发布了我的代码,向您展示了我实现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近似计算从玻璃中重新射出的光线量,需要使用折射角,而不是入射角。
当光线进入玻璃时,使用入射角。

问题是什么?Schlick的近似似乎没有明显的效果,我想知道我是否正确地实现了它。如果没有,我需要改变什么?如果是的话,是否还有其他因素可以解释为什么影响最小