示例#1
0
        public void PathTracePrimitivesTest()
        {
            var geometryList = new GeometryCollection();

            //geometryList.Add(new Plane(new Vector(0, -0.5, 0), new Vector(0, 1, 0)) { Color = Color.White });
            geometryList.Add(new Sphere(new Vector(0, -10000, 0), 9999.5)
            {
                Color = Color.White
            });
            geometryList.Add(new Sphere(new Vector(-0.5, 0, -0.5), 0.5)
            {
                Color = Color.Red
            });
            geometryList.Add(new Sphere(new Vector(+0.5, 0, +0.5), 0.5)
            {
                Color = Color.Green
            });
            geometryList.Add(new Sphere(new Vector(+0.5, 0, -0.5), 0.5)
            {
                Color = Color.Blue
            });
            geometryList.Add(new Sphere(new Vector(-0.5, 0, +0.5), 0.5)
            {
                Color = Color.Yellow
            });

            objectDepth = 3.0;
            double depthOfFocus = objectDepth - 0.5;

            RaytraceScenario(pathTracing: true, shading: false, extraGeometry: geometryList);
            // TODO: in this render, the triangle geometry ends up added twice!
            RaytraceScenario(pathTracing: true, shading: false, extraGeometry: geometryList, focalBlur: true, focalDepth: depthOfFocus, subPixelRes: 4);
            // TODO: in this render, the triangle geometry ends up added 3x!
            RaytraceScenario(pathTracing: true, shading: false, extraGeometry: geometryList, focalBlur: true, focalDepth: depthOfFocus, subPixelRes: 8);
        }
示例#2
0
        // skip all tests up until a specific test, then run it and all the rest

/*
 *      private const string startFromTest = "raytrace/100x100/noShading_staticShadows_lightField";
 *      private bool skipTest = true;
 */

        // TODO: add flag for quad-filtering on color lightfield
        private void RaytraceScenario(bool shading      = true, bool focalBlur = false, bool shadows = false, bool staticShadows          = false,
                                      bool lightField   = false, bool lightFieldWithTris = false, bool pathTracing   = false, bool voxels = false,
                                      int subPixelRes   = 1, int resolution = defaultResolution, double pitchDegrees = defaultPitchDegrees,
                                      double yawDegrees = defaultYawDegrees, double rollDegrees = defaultRollDegrees, double focalDepth = -1, GeometryCollection extraGeometry = null)
        {
            using (var renderer = new Renderer())
            {
                RendererSetup(renderer, modelFileName, pitchDegrees, yawDegrees, rollDegrees, objectDepth, resolution);

                // TODO: raytracer has slight difference on cube edges between Release and Debug mode. Rounding error?
                renderer.rayTrace            = true;
                renderer.rayTraceSubdivision = true;
                renderer.rayTraceShading     = shading;
                renderer.rayTraceFocalBlur   = focalBlur;
                renderer.rayTraceFocalDepth  = (Math.Abs(focalDepth + 1) < 0.001 ? objectDepth + 0.5 : focalDepth);
                renderer.rayTraceSubPixelRes = subPixelRes;
                renderer.rayTracePathTracing = pathTracing;
                renderer.rayTraceVoxels      = voxels;

                renderer.rayTraceShadows       = shadows; // TODO: adding this flag seems to increase test runtime massively! (during focal blur?)
                renderer.rayTraceShadowsStatic = staticShadows;
                // TODO: ambient occlusion has some instability, sometimes causes banding, and fails regression testing
                //renderer.rayTraceAmbientOcclusion = true; // = flags[2];
                // TODO: non-cached AO has many differences to cached AO
                //renderer.ambientOcclusionEnableCache = false;

                // avoid caching static shadows to disk, as this can produce a slightly different image on each test execution
                renderer.CacheStaticShadowsToFile = false;

                // lightfields must be used in x64 mode to avoid 'cannot create MM view' errors
                // TODO: unit testing lightfields with memory-mapped files seems to cause an error for later tests
                renderer.rayTraceLightField        = lightField;
                renderer.LightFieldStoresTriangles = lightFieldWithTris;

                // raytrace any extra geometry beyond the triangle model?
                if (extraGeometry != null)
                {
                    renderer.ExtraGeometryToRaytrace = extraGeometry;
                }

                // when shadows are disabled, static shadows flag has no effect
                if (renderer.rayTraceShadowsStatic && !renderer.rayTraceShadows)
                {
                    return;
                }

                var dirPath  = "raytrace/" + resolution + 'x' + resolution;
                var testName = dirPath + '/' +
                               (renderer.rayTraceVoxels ? "voxels_" : "") +
                               (renderer.rayTracePathTracing ? "pathTracing_" : "") +
                               (renderer.rayTraceShading ? "shading" : "noShading") +
                               (renderer.rayTraceShadows ? (renderer.rayTraceShadowsStatic ? "_staticShadows" : "_shadows") : "") +
                               (renderer.rayTraceAmbientOcclusion ? "_AO" : "") +
                               (lightField && lightFieldWithTris ? "_lightFieldTri" : "") + (lightField && !lightFieldWithTris ? "_lightFieldColor" : "") +
                               (renderer.rayTraceFocalBlur ? "_focalBlur" : "") +
                               (focalBlur ? "x" + subPixelRes : (subPixelRes > 1 ? "_" + subPixelRes + "xAA" : "")) +
                               (extraGeometry != null ? ("_" + (extraGeometry.Count + 1) + "_geometry") : "") +
                               raytraceTestSuffix;

/*
 *              // skip all tests up until a specific test, then run it and all the rest
 *              if (testName == startFromTest)
 *                  skipTest = false;
 *              if (skipTest)
 *                  return;
 */

                Directory.CreateDirectory(candidatePath + dirPath);
                Directory.CreateDirectory(baselinePath + dirPath);

                try
                {
                    RenderAndTest(testName, renderer, resolution, resolution);
                }
                catch (Exception ex)
                {
                    // TODO: reports test name, but breaks stack trace links.
                    //Assert.Fail("{0}: threw exception", testName);
                    Console.WriteLine(ex);
                    throw;
                }
            }
        }