예제 #1
0
        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);
        }
예제 #2
0
        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);
        }