/// <summary> /// Caches the current configuration and re-generates the filter effect of each LOD level to avoid /// generating garbage a each frame. /// </summary> public void SetupTechnique() { // Sanity checks if (levelCoCValues == null && levelDownscaleFactors != null) { throw new ArgumentOutOfRangeException("You cannot provide downscale factors without CoC values first."); } if (levelCoCValues != null && levelDownscaleFactors != null) { if (levelCoCValues.Length != levelDownscaleFactors.Length) { throw new ArgumentOutOfRangeException("levelCoCValues and levelDownscaleFactors must be arrays of the same size!"); } } if (levelCoCValues != null && levelCoCValues.Length == 0) { if (levelCoCValues.Length == 0) { throw new ArgumentOutOfRangeException("DoF configuration needs at least one blur level!"); } if (levelCoCValues[levelCoCValues.Length - 1] != 1f) { throw new ArgumentOutOfRangeException("Last blurriest level must have a CoC of 1.0!"); } } // Default values: 1 original image and 1 blur level int levelCount = 2; if (levelCoCValues != null) { levelCount = levelCoCValues.Length + 1; } CleanupEffects(); cocLevels.Clear(); combineShaderCocLevelValues = new float[levelCount]; // Special case: level 0 is always our original image cocLevels.Add(new CoCLevelConfig { CoCValue = 0f, DownscaleFactor = 0 }); combineShaderCocLevelValues[0] = 0f; // Add a description for each of the blur levels for (int i = 1; i < levelCount; i++) { var blurEffect = Technique.ToBlurInstance(); blurEffect.Initialize(Context); CoCLevelConfig lvlConfig = new CoCLevelConfig { CoCValue = (levelCoCValues != null) ? levelCoCValues[i - 1] : 1f, DownscaleFactor = (levelDownscaleFactors != null) ? levelDownscaleFactors[i - 1] : 1, BlurEffect = blurEffect, }; cocLevels.Add(lvlConfig); // Cache shader parameters combineShaderCocLevelValues[i] = lvlConfig.CoCValue; } configurationDirty = false; }