private IEnumerator RefreshFace(RenderPair pair, Camera camera)
        {
            try
            {
                for (int face = 0; face < 6; face++)
                {
                    camera.transform.rotation = orientations[face];

                    Shader.EnableKeyword("NO_REFLECTION");
                    camera.Render();
                    Shader.DisableKeyword("NO_REFLECTION");

                    Graphics.Blit(pair.Render, pair.Mirror, mirror);
                    Graphics.CopyTexture(pair.Mirror, 0, 0, cubemap, face, 0);

                    Clear(pair);

                    yield return(null);
                }

                cubemap.GenerateMips();
            }
            finally
            {
                rendering  = false;
                refreshing = null;
            }
        }
        private void Clear(RenderPair pair)
        {
            RenderTexture rt = RenderTexture.active;

            RenderTexture.active = pair.Render;
            GL.Clear(true, true, Color.red);

            RenderTexture.active = pair.Mirror;
            GL.Clear(true, true, Color.red);

            RenderTexture.active = rt;
        }
        /*public void PostCullRender(CullingCamera camera)
         * {
         *  if (!visible || !rendering)
         *      return;
         *
         *  Shader.EnableKeyword("NO_REFLECTION");
         *  Camera.Render();
         *  Shader.DisableKeyword("NO_REFLECTION");
         *
         *  cullRenderTimer = -1;
         *  rendering = false;
         * }*/

        private IEnumerator ClearOvertime(RenderPair pair)
        {
            RenderTexture.active = pair.Render;
            GL.Clear(true, true, Color.clear);

            yield return(null);

            RenderTexture.active = pair.Mirror;
            GL.Clear(true, true, Color.clear);

            yield return(null);
        }
        private void CreateData()
        {
            if (Application.isPlaying)
            {
                if (dynamics.Contains(this))
                {
                    return;
                }

                dynamics.Add(this);
            }

            //if (mirror == null)
            //    mirror = new Material(ShadingManager.MirrorShader);

            if (mirror == null)
            {
                mirror = new Material(Shader.Find("Hidden/ReflectorProbe/Mirror"));
            }

            int resolution = GetComponent <ReflectionProbe>().resolution;

            RenderPair pair;

            if (targets.TryGetValue(resolution, out pair))
            {
                pair.Reflections.Add(this);
            }
            else
            {
                RenderTexture render = new RenderTexture(resolution, resolution, 16, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
                render.useMipMap = false;
                render.Create();

                RenderTexture mirror = new RenderTexture(resolution, resolution, 16, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
                mirror.useMipMap = false;
                mirror.Create();

                pair = new RenderPair(render, mirror);
                pair.Reflections.Add(this);
                targets.Add(resolution, pair);
            }
        }
        private void RefreshInstant(RenderPair pair, Camera camera)
        {
            try
            {
                for (int face = 0; face < 6; face++)
                {
                    camera.transform.rotation = orientations[face];

                    Shader.EnableKeyword("NO_REFLECTION");
                    camera.Render();
                    Shader.DisableKeyword("NO_REFLECTION");

                    Graphics.Blit(pair.Render, pair.Mirror, mirror);

                    RenderTexture source      = pair.Mirror;
                    RenderTexture destination = pair.Render;
                    for (int i = 0; i < effects.Length; i++)
                    {
                        if (effects[i].Render(source, destination))
                        {
                            RenderTexture temp = source;
                            source      = destination;
                            destination = temp;
                        }
                    }

                    Graphics.CopyTexture(source, 0, 0, cubemap, face, 0);

                    Clear(pair);
                }

                cubemap.GenerateMips();
            }
            finally
            {
                rendering  = false;
                refreshing = null;
            }
        }
        private IEnumerator RefreshOvertime(RenderPair pair, Camera camera)
        {
            try
            {
                for (int face = 0; face < 6; face++)
                {
                    yield return(ClearOvertime(pair));

                    camera.transform.rotation = orientations[face];

                    rendering       = true;
                    cullRenderTimer = 0.25f;
                    while (cullRenderTimer > 0)
                    {
                        cullRenderTimer -= Time.deltaTime;
                        yield return(null);
                    }

                    yield return(null);

                    Graphics.Blit(pair.Render, pair.Mirror, mirror);

                    yield return(null);

                    Graphics.CopyTexture(pair.Mirror, 0, 0, cubemap, face, 0);

                    yield return(null);
                }

                cubemap.GenerateMips();
            }
            finally
            {
                rendering  = false;
                refreshing = null;
            }
        }