コード例 #1
0
        public Color Shade(HitRecord record, Vector3 wi)
        {
            Color   pixelColor = new Color(0, 0, 0);
            Vector3 normal     = record.SurfaceNormal;

            normal.Normalize();
            wi.Normalize();

            float noiseCoefficient = 0f;

            switch (Noise)
            {
            case Noise.Turbulence:
                noiseCoefficient = Turbulence(record.IntersectionPoint);
                break;

            case Noise.Marble:
                noiseCoefficient = Marble(record.IntersectionPoint);
                break;

            case Noise.Bumb:
                noiseCoefficient = 1f;
                normal           = Bump(record.IntersectionPoint, normal);
                break;

            case Noise.None:
                noiseCoefficient = 1f;
                break;

            default:
                noiseCoefficient = 1f;
                break;
            }

            if (BumpTexture != null)
            {
                Color   displacementColor  = BumpTexture.GetColorFromTexCoordinate(record.HitObject.GetTextudeCoordinates(record));
                Vector3 displacementNormal = normal;
                displacementNormal.X = ((displacementColor.R * 2) - 1);
                displacementNormal.Y = ((displacementColor.G * 2) - 1);
                displacementNormal.Z = displacementColor.B;
                normal = (Vector3.Dot(displacementNormal, normal) < 0) ? -displacementNormal : displacementNormal;
            }

            float nDotL = Vector3.Dot(normal, wi);

            if (nDotL > 0)
            {
                Color diffuse;

                if (Constants.TextureMapping && ColorTexture != null && !(record.HitObject is Plane))
                {
                    diffuse = ColorTexture.GetColorFromTexCoordinate(record.HitObject.GetTextudeCoordinates(record));
                }
                else
                {
                    diffuse = Diffuse;
                }

                //add Diffuse Light
                pixelColor.Append(diffuse.Mult(nDotL).Mult(noiseCoefficient));
                pixelColor.Append(pixelColor.Mult(1f - noiseCoefficient));
                //Calculate the Blinn halfVector
                Vector3 h = wi;
                h = Vector3.Add(h, wi);
                h.Normalize();


                float hDotN = Vector3.Dot(h, normal);
                if (hDotN > 0)
                {
                    float pow = (float)Math.Pow(hDotN, Shininess);
                    pixelColor.Append(Specular.Mult(pow));
                }
            }
            pixelColor.Append(Ambient);
            pixelColor.Clamp(0f, 1f);
            return(pixelColor);
        }