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); }
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); }