public bool Scatter(Ray ray, UnityEngine.Vector3 point, UnityEngine.Vector3 normal, out UnityEngine.Vector3 attenuation, out Ray scattered)
        {
            var reflected = Exten.reflect(ray.direction, normal);

            if (fuzz > 0)
            {
                reflected = reflected + fuzz * Exten.RandomVecInSphere();
            }
            scattered   = new Ray(point, reflected);
            attenuation = color;
            return(UnityEngine.Vector3.Dot(ray.direction, normal) < 0);
        }
        public bool Scatter(Ray ray, UnityEngine.Vector3 point, UnityEngine.Vector3 normal, out UnityEngine.Vector3 attenuation, out Ray scattered)
        {
            attenuation = new UnityEngine.Vector3(1.0f, 1.0f, 1.0f);
            float eta = ref_idx;
            var   n   = normal;


            if (UnityEngine.Vector3.Dot(ray.direction, normal) > 0)//从内到外
            {
                n = new UnityEngine.Vector3(-normal.x, -normal.y, -normal.z);
            }
            else
            {
                eta = 1.0f / eta;
            }

            UnityEngine.Vector3 r;
            float prob = 1.0f;

            if (Exten.refract(ray.direction, n, eta, out r))
            {
                float cosi = -UnityEngine.Vector3.Dot(ray.direction, n);
                float cost = -UnityEngine.Vector3.Dot(r, n);
                prob = fresnel(cosi, cost, eta);
            }
            if (Exten.rand01() < prob)
            {
                UnityEngine.Vector3 reflected = Exten.reflect(ray.direction, normal);
                scattered = new Ray(point, reflected);
            }
            else
            {
                scattered = new Ray(point, r);
            }
            return(true);
        }