示例#1
0
    public override bool Scatter(RTRay ray, HitRecord hit, out Color attenuation, out RTRay scattered)
    {
        Vector3 reflected = RTMath.Reflect(ray.direction.normalized, hit.n);

        scattered   = new RTRay().Set(hit.p, reflected + fuzz * RTMath.RndInUnitSphere());
        attenuation = albedo;
        return(Vector3.Dot(scattered.direction, hit.n) > 0);
    }
示例#2
0
    public override bool Scatter(RTRay ray, HitRecord hit, out Color attenuation, out RTRay scattered)
    {
        attenuation = new Color(1, 1, 1);

        Vector3 outwardN;
        float   ni_over_nt;
        Vector3 refracted;
        float   reflect_prob;
        float   cosine;

        if (Vector3.Dot(ray.direction, hit.n) > 0)
        {
            outwardN   = -hit.n;
            ni_over_nt = refractiveIndex;
            cosine     = Vector3.Dot(ray.direction, hit.n) / ray.direction.magnitude;
        }
        else
        {
            outwardN   = hit.n;
            ni_over_nt = 1.0f / refractiveIndex;
            cosine     = -Vector3.Dot(ray.direction, hit.n) / ray.direction.magnitude;
        }

        if (RTMath.Refract(ray.direction, outwardN, ni_over_nt, out refracted))
        {
            reflect_prob = RTMath.schlick(cosine, refractiveIndex);
        }
        else
        {
            reflect_prob = 1.0f;
        }

        if (RTMath.Rnd01() < reflect_prob)
        {
            scattered = new RTRay().Set(hit.p, RTMath.Reflect(ray.direction, hit.n));
        }
        else
        {
            scattered = new RTRay().Set(hit.p, refracted);
        }

        return(true);
    }