示例#1
0
        }         // Start()

        #endregion

        #region Show
        /// <summary>
        /// Execute shaders and show result on screen, Start(..) must have been
        /// called before and the scene should be rendered to sceneMapTexture.
        /// </summary>
        public void Show()
        {
            // Only apply post screen glow if texture is valid and effect is valid
            if (sceneMapTexture == null ||
                Valid == false ||
                started == false)
            {
                return;
            }

            started = false;

            // Resolve sceneMapTexture render target for Xbox360 support
            sceneMapTexture.Resolve(true);

            try
            {
                // Don't use or write to the z buffer
                BaseGame.Device.RenderState.DepthBufferEnable      = false;
                BaseGame.Device.RenderState.DepthBufferWriteEnable = false;
                // Also don't use any kind of blending.
                BaseGame.Device.RenderState.AlphaBlendEnable = false;
                //unused: BaseGame.Device.RenderState.Lighting = false;

                if (windowSize != null)
                {
                    windowSize.SetValue(new float[]
                                        { sceneMapTexture.Width, sceneMapTexture.Height });
                }
                if (sceneMap != null)
                {
                    sceneMap.SetValue(sceneMapTexture.XnaTexture);
                }
                if (downsampleMap != null)
                {
                    downsampleMap.SetValue(downsampleMapTexture.XnaTexture);
                }
                if (blurMap1 != null)
                {
                    blurMap1.SetValue(blurMap1Texture.XnaTexture);
                }
                if (blurMap2 != null)
                {
                    blurMap2.SetValue(blurMap2Texture.XnaTexture);
                }
                if (radialSceneMap != null)
                {
                    radialSceneMap.SetValue(radialSceneMapTexture.XnaTexture);
                }

                RadialBlurScaleFactor = //-0.0125f;
                                        // Warning: To big values will make the motion blur look to
                                        // stepy (we see each step and thats not good). -0.02 should be max.
                                        -(0.005f + Player.Speed * 0.015f);

                if (BaseGame.UsePS20)
                {
                    effect.CurrentTechnique = effect.Techniques["ScreenGlow20"];
                }
                else
                {
                    effect.CurrentTechnique = effect.Techniques["ScreenGlow"];
                }

                // We must have exactly 5 passes!
                if (effect.CurrentTechnique.Passes.Count != 5)
                {
                    throw new Exception("This shader should have exactly 5 passes!");
                }

                effect.Begin();                //SaveStateMode.None);
                for (int pass = 0; pass < effect.CurrentTechnique.Passes.Count;
                     pass++)
                {
                    if (pass == 0)
                    {
                        radialSceneMapTexture.SetRenderTarget();
                    }
                    else if (pass == 1)
                    {
                        downsampleMapTexture.SetRenderTarget();
                    }
                    else if (pass == 2)
                    {
                        blurMap1Texture.SetRenderTarget();
                    }
                    else if (pass == 3)
                    {
                        blurMap2Texture.SetRenderTarget();
                    }
                    else
                    {
                        // Do a full reset back to the back buffer
                        RenderToTexture.ResetRenderTarget(true);
                    }

                    EffectPass effectPass = effect.CurrentTechnique.Passes[pass];
                    effectPass.Begin();
                    // For first effect we use radial blur, draw it with a grid
                    // to get cooler results (more blur at borders than in middle).
                    if (pass == 0)
                    {
                        VBScreenHelper.Render10x10Grid();
                    }
                    else
                    {
                        VBScreenHelper.Render();
                    }
                    effectPass.End();

                    if (pass == 0)
                    {
                        radialSceneMapTexture.Resolve(false);
                        if (radialSceneMap != null)
                        {
                            radialSceneMap.SetValue(radialSceneMapTexture.XnaTexture);
                        }
                        effect.CommitChanges();
                    }                     // if
                    else if (pass == 1)
                    {
                        downsampleMapTexture.Resolve(false);
                        if (downsampleMap != null)
                        {
                            downsampleMap.SetValue(downsampleMapTexture.XnaTexture);
                        }
                        effect.CommitChanges();
                    }                     // if
                    else if (pass == 2)
                    {
                        blurMap1Texture.Resolve(false);
                        if (blurMap1 != null)
                        {
                            blurMap1.SetValue(blurMap1Texture.XnaTexture);
                        }
                        effect.CommitChanges();
                    }                     // else if
                    else if (pass == 3)
                    {
                        blurMap2Texture.Resolve(false);
                        if (blurMap2 != null)
                        {
                            blurMap2.SetValue(blurMap2Texture.XnaTexture);
                        }
                        effect.CommitChanges();
                    }     // else if
                }         // for (pass, <, ++)
            }             // try
            catch (Exception ex)
            {
                // Make effect invalid, continue rendering without this
                // post screen shader.
                effect = null;
                RenderToTexture.ResetRenderTarget(true);
#if DEBUG
                throw ex;
#else
                Log.Write("Failed to render post screen shader " + Filename + ": " +
                          ex.ToString());
#endif
            }             // catch
            finally
            {
                if (effect != null)
                {
                    effect.End();
                }

                // Restore z buffer state
                BaseGame.Device.RenderState.DepthBufferEnable      = true;
                BaseGame.Device.RenderState.DepthBufferWriteEnable = true;
            }     // finally
        }         // Show()
        }         // GetParameters()

        #endregion

        #region Render sky
        /// <summary>
        /// Render sky with help of shader.
        /// </summary>
        public void RenderSky(float setWrappingScale, Color setSkyColor)
        {
            // Can't render with shader if shader is not valid!
            if (this.Valid == false)
            {
                return;
            }

            try
            {
                // Don't use or write to the z buffer
                BaseGame.Device.RenderState.DepthBufferEnable      = false;
                BaseGame.Device.RenderState.DepthBufferWriteEnable = false;

                // Also don't use any kind of blending.
                BaseGame.Device.RenderState.AlphaBlendEnable = false;

                Scale        = setWrappingScale;
                AmbientColor = setSkyColor;
                // Rotate view matrix by level number, this way we look to a different
                // direction depending on which level we are in.
                Matrix invViewMatrix = BaseGame.InverseViewMatrix *
                                       Matrix.CreateRotationY((float)Math.PI +
                                                              Level.currentLevelNumber * (float)Math.PI / 2.0f);
                InverseViewMatrix = invViewMatrix;

                // Start shader
                try
                {
                    // Remember old state because we will use clamp texturing here
                    effect.Begin(SaveStateMode.SaveState);

                    // Render with specific pass
                    //foreach (EffectPass pass in effect.Techniques[0].Passes)
                    for (int num = 0; num < effect.CurrentTechnique.Passes.Count; num++)
                    {
                        EffectPass pass = effect.CurrentTechnique.Passes[num];

                        // Render each pass
                        pass.Begin();
                        VBScreenHelper.Render();
                        pass.End();
                    }             // foreach (pass)
                }                 // try
                finally
                {
                    // End shader
                    effect.End();
                }         // finally
            }             // try
            catch (Exception ex)
            {
                Log.Write("Failed to render " +
                          Filename + " shader: " + ex.ToString());
                // Make shader invalid, so we don't call it anymore
                effect = null;
            }             // catch
            finally
            {
                // Enable z buffer again
                BaseGame.Device.RenderState.DepthBufferEnable      = true;
                BaseGame.Device.RenderState.DepthBufferWriteEnable = true;
            }     // finally
        }         // RenderSky(setWrappingScale, setSkyColor)