public override bool Scatter(Scene scene, Ray ray, HitRecord hit, out Attenuation attenuation, out Ray scattered) { scattered = new Ray(hit.position, ray.direction); var textureColor = GetTextureColor(hit.uv); attenuation = Attenuation.Blend(albedo * textureColor, 1 - transparency, albedo * textureColor); attenuation.forceToDoAnotherPass = true; return(true); }
public override bool Scatter(Scene scene, Ray ray, HitRecord hit, out Attenuation attenuation, out Ray scattered) { var direction = Vector3.Normalize(ray.direction); Vector3 reflected = Vector3.Reflect(direction, hit.normal); scattered = new Ray(hit.position, reflected + fuzz * Sphere.RandomInUnitSphere()); Vector3 diffuseColor = Vector3.Zero; Vector3 SpecularColor = Vector3.Zero; foreach (var light in scene.lights) { if (CastShadow(scene, light, hit)) { continue; } Vector3 lightDir = -Vector3.Normalize(hit.position - light.position); Vector3 reflectDir = Vector3.Reflect(-lightDir, hit.normal); diffuseColor += light.color * light.insensity * Vector3.Dot(hit.normal, lightDir); SpecularColor += light.color * light.insensity * specularIndex * MathF.Pow(Math.Clamp(Vector3.Dot(reflectDir, -direction), 0, 1), glossIndex); } //环境光 + 光源 var textureColor = GetTextureColor(hit.uv); var allColor = (scene.ambientColor + diffuseColor) * albedo * textureColor + SpecularColor; attenuation = Attenuation.Blend(allColor, blendPercent, albedo * textureColor); attenuation.attenuationType = attenuationType; //兼容easyPipeline if (fuzz == 0 && specularIndex == 1) { attenuation.forceToDoAnotherPass = true; } //attenuation = Attenuation.None(new Vector3(hit.uv.X, hit.uv.Y,0)); return(true);//(Vector3.Dot(scattered.direction, hit.normal) > 0); }