Color GetColorForTestAntialiasing(Ray ray, HitableList hitableList) { HitRecord record = new HitRecord(); if (hitableList.Hit(ray, 0f, float.MaxValue, ref record)) { return(0.5f * new Color(record.normal.x + 1, record.normal.y + 1, record.normal.z + 1, 2)); } float t = 0.5f * ray.normalDirection.y + 1f; return((1 - t) * new Color(1, 1, 1) + t * new Color(0.5f, 0.7f, 1.0f)); }
Color GetColorForTestDiffusing(Ray ray, HitableList hitableList) { HitRecord record = new HitRecord(); if (hitableList.Hit(ray, 0.0001f, float.MaxValue, ref record)) { Vector3 target = record.p + record.normal + GetRandomPointInUnitSphereForTestDiffusing(); //此处假定有50%的光被吸收,剩下的则从入射点开始取随机方向再次发射一条射线 return(0.5f * GetColorForTestDiffusing(new Ray(record.p, target - record.p), hitableList)); } float t = 0.5f * ray.normalDirection.y + 1f; return((1 - t) * new Color(1, 1, 1) + t * new Color(0.5f, 0.7f, 1f)); }
Color GetColorForTestDefocus(Ray ray, HitableList hitableList, int depth) { HitRecord record = new HitRecord(); if (hitableList.Hit(ray, 0.0001f, float.MaxValue, ref record)) { Ray r = new Ray(Vector3.zero, Vector3.zero); Color attenuation = Color.black; if (depth < MAX_SCATTER_TIME && record.material.scatter(ray, record, ref attenuation, ref r)) { Color c = GetColorForTestDefocus(r, hitableList, depth + 1); return(new Color(c.r * attenuation.r, c.g * attenuation.g, c.b * attenuation.b)); } else { //假设已经反射了太多次,或者压根就没有发生反射,那么就认为黑了 return(Color.black); } } float t = 0.5f * ray.normalDirection.y + 1f; return((1 - t) * new Color(1, 1, 1) + t * new Color(0.5f, 0.7f, 1f)); }