Exemplo n.º 1
0
 public static ColorPacket256 Times(ColorPacket256 left, ColorPacket256 right)
 {
     return(new VectorPacket256(Multiply(left.Xs, right.Xs), Multiply(left.Ys, right.Ys),
                                Multiply(left.Zs, right.Zs)));
 }
Exemplo n.º 2
0
        private ColorPacket256 GetNaturalColor(Vector256 <int> things, VectorPacket256 pos, VectorPacket256 norms,
                                               VectorPacket256 rds, Scene scene)
        {
            var colors = ColorPacket256Helper.DefaultColor;

            for (int i = 0; i < scene.Lights.Length; i++)
            {
                var lights       = scene.Lights[i];
                var zero         = Vector256 <float> .Zero;
                var colorPacket  = lights.Colors;
                var ldis         = lights.Positions - pos;
                var livec        = ldis.Normalize();
                var neatIsectDis = TestRay(new RayPacket256(pos, livec), scene);

                // is in shadow?
                var mask1      = Compare(neatIsectDis, ldis.Lengths, FloatComparisonMode.LessThanOrEqualOrderedNonSignaling);
                var mask2      = Compare(neatIsectDis, zero, FloatComparisonMode.NotEqualOrderedNonSignaling);
                var isInShadow = And(mask1, mask2);

                Vector256 <float> illum = VectorPacket256.DotProduct(livec, norms);
                Vector256 <float> illumGraterThanZero =
                    Compare(illum, zero, FloatComparisonMode.GreaterThanOrderedNonSignaling);
                var tmpColor1             = illum * colorPacket;
                var defaultRGB            = zero;
                Vector256 <float> lcolorR = BlendVariable(defaultRGB, tmpColor1.Xs, illumGraterThanZero);
                Vector256 <float> lcolorG = BlendVariable(defaultRGB, tmpColor1.Ys, illumGraterThanZero);
                Vector256 <float> lcolorB = BlendVariable(defaultRGB, tmpColor1.Zs, illumGraterThanZero);
                ColorPacket256    lcolor  = new ColorPacket256(lcolorR, lcolorG, lcolorB);

                Vector256 <float> specular = VectorPacket256.DotProduct(livec, rds.Normalize());
                Vector256 <float> specularGraterThanZero =
                    Compare(specular, zero, FloatComparisonMode.GreaterThanOrderedNonSignaling);

                var difColor  = new ColorPacket256(1, 1, 1);
                var splColor  = new ColorPacket256(1, 1, 1);
                var roughness = Vector256.Create(1.0f);

                for (int j = 0; j < scene.Things.Length; j++)
                {
                    Vector256 <float> thingMask = CompareEqual(things, Vector256.Create(j)).AsSingle();
                    Vector256 <float> rgh       = Vector256.Create(scene.Things[j].Surface.Roughness);
                    var dif = scene.Things[j].Surface.Diffuse(pos);
                    var spl = scene.Things[j].Surface.Specular;

                    roughness = BlendVariable(roughness, rgh, thingMask);

                    difColor.Xs = BlendVariable(difColor.Xs, dif.Xs, thingMask);
                    difColor.Ys = BlendVariable(difColor.Ys, dif.Ys, thingMask);
                    difColor.Zs = BlendVariable(difColor.Zs, dif.Zs, thingMask);

                    splColor.Xs = BlendVariable(splColor.Xs, spl.Xs, thingMask);
                    splColor.Ys = BlendVariable(splColor.Ys, spl.Ys, thingMask);
                    splColor.Zs = BlendVariable(splColor.Zs, spl.Zs, thingMask);
                }

                var tmpColor2             = VectorMath.Pow(specular, roughness) * colorPacket;
                Vector256 <float> scolorR = BlendVariable(defaultRGB, tmpColor2.Xs, specularGraterThanZero);
                Vector256 <float> scolorG = BlendVariable(defaultRGB, tmpColor2.Ys, specularGraterThanZero);
                Vector256 <float> scolorB = BlendVariable(defaultRGB, tmpColor2.Zs, specularGraterThanZero);
                ColorPacket256    scolor  = new ColorPacket256(scolorR, scolorG, scolorB);

                var oldColor = colors;

                colors = colors + ColorPacket256Helper.Times(difColor, lcolor) +
                         ColorPacket256Helper.Times(splColor, scolor);

                colors = new ColorPacket256(BlendVariable(colors.Xs, oldColor.Xs, isInShadow),
                                            BlendVariable(colors.Ys, oldColor.Ys, isInShadow),
                                            BlendVariable(colors.Zs, oldColor.Zs, isInShadow));
            }

            return(colors);
        }
Exemplo n.º 3
0
 public LightPacket256(Vector pos, Color col)
 {
     Positions = new VectorPacket256(pos.X, pos.Y, pos.Z);
     Colors    = new ColorPacket256(col.R, col.G, col.B);
 }