Exemple #1
0
        /// <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;
        }