1

そのため、私が構築しているレイトレーサー用の屈折ガラス球の作成に取り組んでおり、このサイトの別のユーザーの提案に従って、ガラスをよりリアルに見せるために、フレネル屈折のシュリックの近似を実装しようとしています。しかし、それを実装した後、私のガラスはまだかなり光沢がありません。鏡面反射も多少ある以外は見た目の違いはほとんどありませんが、鏡球と屈折球を人工的に組み合わせたような感じです。スタック オーバーフローで写真を簡単にアップロードできる方法があればいいのにと思います。

シュリックの近似を実装する部分を示すために、以下にコードを投稿しました。近似を計算した後、シーンをレイトレースするために 2 つの再帰呼び出しを行います。1 つは反射光線用で、もう 1 つは屈折光線用です。

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

1 に答える 1