示例#1
0
    internal int RunNodeTest(GraphData graph, string filePrefix, SetupMaterialDelegate setupMaterial = null, Color32?expectedColor = null, int expectedIncorrectPixels = 0, int errorThreshold = 0)
    {
        RenderTextureDescriptor descriptor = new RenderTextureDescriptor(defaultResolution, defaultResolution, GraphicsFormat.R8G8B8A8_SRGB, depthBufferBits: 32);
        var target = RenderTexture.GetTemporary(descriptor);

        // use a non-standard transform, so that view, object, etc. transforms are non trivial
        RenderQuadPreview(graph, target, testPosition, testRotation, setupMaterial, Mode.DIFF, useSRP: true);

        // default expected color is green (test shaders should be set up to return green on success)
        int incorrectPixels = CountPixelsNotEqual(target, expectedColor ?? new Color32(0, 255, 0, 255), false, errorThreshold);

        if (incorrectPixels != expectedIncorrectPixels)
        {
            // report images
            SaveToPNG(target, $"test-results/NodeTests/{filePrefix}.diff.png");

            RenderQuadPreview(graph, target, testPosition, testRotation, setupMaterial, Mode.EXPECTED, useSRP: true);
            SaveToPNG(target, $"test-results/NodeTests/{filePrefix}.expected.png");

            RenderQuadPreview(graph, target, testPosition, testRotation, setupMaterial, Mode.ACTUAL, useSRP: true);
            SaveToPNG(target, $"test-results/NodeTests/{filePrefix}.png");

            // record failure
            wrongImageCount++;
            int wrongPixels = Math.Abs(incorrectPixels - expectedIncorrectPixels);
            if (wrongPixels > mostWrongPixels)
            {
                mostWrongPixels = wrongPixels;
                mostWrongString = $"{filePrefix} incorrect pixels expected: {expectedIncorrectPixels} actual: {incorrectPixels}";
            }
        }

        RenderTexture.ReleaseTemporary(target);
        return(incorrectPixels);
    }
示例#2
0
    internal void RenderQuadPreview(GraphData graph, RenderTexture target, Vector3 scenePosition, Quaternion sceneRotation, SetupMaterialDelegate setupMaterial = null, Mode mode = Mode.DIFF, bool useSRP = false)
    {
        var camXform = previewScene.camera.transform;

        // setup 2D quad render
        camXform.position = -Vector3.forward * 2 + scenePosition;
        camXform.rotation = sceneRotation;
        previewScene.camera.orthographicSize = 0.5f;
        previewScene.camera.orthographic     = true;

        graph.ValidateGraph();

        // build the shader
        var shader = BuildShaderGraph(graph, "Test Shader");
        var mat    = new Material(shader)
        {
            hideFlags = HideFlags.HideAndDontSave
        };

        SetKeyword(mat, "_MODE_DIFF", (mode == Mode.DIFF));
        SetKeyword(mat, "_MODE_EXPECTED", (mode == Mode.EXPECTED));
        SetKeyword(mat, "_MODE_ACTUAL", (mode == Mode.ACTUAL));

        if (setupMaterial != null)
        {
            setupMaterial(mat);
        }

        var quadMatrix = Matrix4x4.TRS(camXform.position + camXform.forward * 2, camXform.rotation, Vector3.one);

        // render with it
        RenderMeshWithMaterial(previewScene.camera, previewScene.quad, quadMatrix, mat, target, useSRP);
    }