{"record":{"id":"befcc28c51e769d4","repo":"stride3d/stride","slug":"quality-should-be-between-minquality-and-maxquality-for","errorCode":null,"errorMessage":"Quality should be between {minQuality} and {maxQuality} for dither level {Dither}","messagePattern":"Quality should be between (.+?) and (.+?) for dither level (.+?)","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Rendering/Rendering/Images/AntiAliasing/FXAAEffect.cs","lineNumber":94,"sourceCode":"            {\n                case DitherType.Medium:\n                    return (0, 5);\n                case DitherType.Low:\n                    return (0, 9);\n                case DitherType.None:\n                    return (9, 9);\n                default:\n                    throw new ArgumentOutOfRangeException(nameof(Dither));\n            }\n        }\n\n        protected override void UpdateParameters()\n        {\n            base.UpdateParameters();\n            Parameters.Set(GreenAsLumaKey, InputLuminanceInAlpha ? 0 : 1);\n            var (minQuality, maxQuality) = GetQualityRange(Dither);\n            if (Quality < minQuality || Quality > maxQuality)\n                throw new ArgumentOutOfRangeException(nameof(Quality), $\"Quality should be between {minQuality} and {maxQuality} for dither level {Dither}\");\n            Parameters.Set(QualityKey, (int)Dither + Quality);\n        }\n\n        /// <summary>\n        /// The dithering level used by FXAA.\n        /// </summary>\n        public enum DitherType\n        {\n            [Display(\"Medium (Fastest)\")]\n            Medium = 10,\n\n            [Display(\"Low (Normal)\")]\n            Low = 20,\n\n            [Display(\"None (Slowest)\")]\n            None = 30,\n        }\n    }","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Rendering/Rendering/Images/AntiAliasing/FXAAEffect.cs#L76-L112","documentation":"FXAAEffect.UpdateParameters throws ArgumentOutOfRangeException when the Quality property is outside the valid range for the current Dither level. Each dithering level only supports a specific FXAA_QUALITY__PRESET range, computed via GetQualityRange(Dither), and the shader preset index is derived as (int)Dither + Quality, so out-of-range values would produce an invalid shader permutation.","triggerScenarios":"Setting Quality below minQuality or above maxQuality for the current Dither value before rendering; changing Dither to a level whose quality range excludes the already-set Quality.","commonSituations":"Hard-coding a quality value that was valid for one dither level but not another; UI sliders that don't clamp to GetQualityRange; copying FXAA settings between projects with different dither levels.","solutions":["Query GetQualityRange(Dither) and clamp Quality into [minQuality, maxQuality] before rendering.","Adjust Dither to a level that supports the desired Quality value.","Call UpdateParameters only after both Dither and Quality are set to consistent values."],"exampleFix":"// before\nfxaa.Dither = DitherType.Low;\nfxaa.Quality = 20; // out of range for Low\n// after\nvar (minQ, maxQ) = FXAAEffect.GetQualityRange(DitherType.Low);\nfxaa.Dither = DitherType.Low;\nfxaa.Quality = Math.Clamp(20, minQ, maxQ);","handlingStrategy":"validation","validationCode":"var (minQ, maxQ) = FXAAEffect.GetQualityRange(dither);\nfxaa.Quality = Math.Clamp(desiredQuality, minQ, maxQ);\nfxaa.Dither = dither;","typeGuard":null,"tryCatchPattern":"try { fxaa.Dither = dither; fxaa.Quality = q; }\ncatch (ArgumentOutOfRangeException ex) { Log.Error(ex, \"FXAA quality out of range for dither level\"); }","preventionTips":["Always re-check GetQualityRange after changing Dither","Clamp UI slider values to the current quality range","Set Dither and Quality together from a single validated source"],"tags":["argument-out-of-range","quality","antialiasing"],"backgroundTag":"value-out-of-range","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}