光线跟踪折射看起来"fake"



所以在我的光线追踪器,我正在建设我已经得到折射工作与焦散效应,但是玻璃球看起来不是特别好。我相信折射的数学是正确的,因为光看起来是以你期望的方式弯曲的,但是它看起来不像玻璃,它看起来像纸或其他东西。

我读到过全内反射是玻璃看起来像它的大部分原因,但是当我测试我的折射光线是否超过临界角时,没有一个超过临界角,所以我的玻璃球没有全内反射。我不确定这是正常的还是我做错了什么。我把我的折射代码贴在下面,如果有人有任何建议,我很乐意听听。

/*
 * Parameter 'dir' lets you know whether the ray is starting
 * from outside the sphere going in (0) or from in the sphere
 * going back out (1).
 */
void Ray::Refract(Intersection *hit, int dir)
{
    float n1, n2;
    if(dir == 0){ n1 = 1.0; n2 = hit->mat->GetRefract(); }
    if(dir == 1){ n1 = hit->mat->GetRefract(); n2 = 1.0; }
    STVector3 N = hit->normal/hit->normal.Length();
    if(dir == 1) N = -N;
    STVector3 V = D/D.Length();
    double c1 = -STVector3::Dot(N, V);
    double n = n1/n2;
    double c2 = sqrt(1.0f - (n*n)*(1.0f - (c1*c1))); 
    STVector3 Rr = (n * V) + (n * c1 - c2) * N;
    /*These are the parameters of the current ray being updated*/
    E = hit->point;  //Starting point
    D = Rr;          //Direction
}

这个方法在我的主光线追踪方法RayTrace()中调用,它递归地运行。下面是它的一小部分,负责折射:

    if (hit->mat->IsRefractive())
    {    
        temp.Refract(hit, dir); //Temp is my ray that is being refracted
        dir++;
        result += RayTrace(temp, dir); //Result is the return RGB value.
    } 

你是对的,你永远不会在一个球体中得到完全的内部反射(从外面看)。这是由于对称的缘故:在球内的光线会在两端以相同的角度撞击表面,这意味着,如果它在一端超过了临界角,它在另一端也必须超过临界角(这样就不可能从外面进入球了)。

然而,根据菲涅耳定律,你仍然会得到很多部分反射。看起来你的代码不能解释这个,这可能就是为什么你的眼镜看起来是假的。试着把它写进去,看看是否有帮助。

(是的,这意味着你的光线在碰到折射表面时会分裂成两半。这在现实中会发生,所以你只能接受它。你可以跟踪两条路径,或者,如果你使用随机光线跟踪算法,只是随机采样其中一个适当的权重。

p。如果你不想处理像光偏振这样的问题,你可能只想使用菲涅耳方程的Schlick近似。

相关内容

  • 没有找到相关文章

最新更新