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