Menu

A

|

A

Appliquer un Shader sur le rendu final

Article pour un rendu en 2D avec XNA 3.0

Quand on développe des jeux avec XNA, on voudrais parfois appliquer un Shader sur le rendu final de la scène, à savoir l’image qui est produite après le rendu de chaque objet de notre jeu. Appliquer un Shader sur un objet est chose facile, mais sur le rendu final de la scène en est une autre.

La première question que l’on se pose : Comment récupérer le rendu final sous forme de texture 2D. Pour cela il faut savoir qu’il est possible de détourner le rendu effectué par le SpriteBatch vers une autre source de rendu que le buffer d’affichage. Pour ce la il suffit d’utiliser la fonction SetRenderTarget() sur l’objet GraphicDevice. Cette fonction permet de changer l’endroit ou le rendu est fait.

Une fois cette fonction invoquée, vous pouvez dessiner avec le SpriteBatch et pour récupérer le résultat il suffit d’appeller ResolveBackBuffer() sur l’objet GraphicDevice. Vous allez alors récupérer une Texture2D sur laquelle vous pourrez appliquer le Shader final. Il faudra par contre ne pas oublier de changer le buffer de rendu pour revenir vers le buffer d’affichage.

RenderTarget2D renderTarget;
SpriteBatch spriteBatch;

// Création du SpriteBatch

spriteBatch = new SpriteBatch(this.GraphicsDevice);

// On change le buffer d'écriture pour rendre
// la scéne dans une Texture2D de type RenderTarget2D

this.GraphicsDevice.SetRenderTarget(0, renderTarget);
this.GraphicsDevice.Clear(Color.TransparentWhite);

// On dessine notre scène

spriteBatch.Begin();

// ...

spriteBatch.End();

// On remet le buffer d'écriture sur l'écran

this.GraphicsDevice.SetRenderTarget(0, null);

// On charge notre Shader

Effect effect = this.Content.Load<Effect>("MonShader");

// Démarage de l'affichage, on commence par le BEGIN du spriteBatch
// puis par celui du Shader pour préparer le Device au rendu

spriteBatch.Begin();
effect.Begin();

// On effectue les passes du Shader (en prenant la texture du render target)

foreach ( EffectPass oPass in effect.CurrentTechnique.Passes )
{
oPass.Begin();
spriteBatch.Draw(renderTarget.GetTexture(), new Vector2(0.0f, 0.0f), Color.White);
oPass.End();
}

// Fin du rendu du Shader

effect.End();
spriteBatch.End();

Appliquer un Shader sur le rendu final

Article pour un rendu en 2D avec XNA 3.0

Quand on développe des jeux avec XNA, on voudrais parfois appliquer un Shader sur le rendu final de la scène, à savoir l’image qui est produite après le rendu de chaque objet de notre jeu. Appliquer un Shader sur un objet est chose facile, mais sur le rendu final de la scène en est une autre.

La première question que l’on se pose : Comment récupérer le rendu final sous forme de texture 2D. Pour cela il faut savoir qu’il est possible de détourner le rendu effectué par le SpriteBatch vers une autre source de rendu que le buffer d’affichage. Pour ce la il suffit d’utiliser la fonction SetRenderTarget() sur l’objet GraphicDevice. Cette fonction permet de changer l’endroit ou le rendu est fait.

Une fois cette fonction invoquée, vous pouvez dessiner avec le SpriteBatch et pour récupérer le résultat il suffit d’appeller ResolveBackBuffer() sur l’objet GraphicDevice. Vous allez alors récupérer une Texture2D sur laquelle vous pourrez appliquer le Shader final. Il faudra par contre ne pas oublier de changer le buffer de rendu pour revenir vers le buffer d’affichage.

RenderTarget2D renderTarget;
SpriteBatch spriteBatch;

// Création du SpriteBatch

spriteBatch = new SpriteBatch(this.GraphicsDevice);

// On change le buffer d'écriture pour rendre
// la scéne dans une Texture2D de type RenderTarget2D

this.GraphicsDevice.SetRenderTarget(0, renderTarget);
this.GraphicsDevice.Clear(Color.TransparentWhite);

// On dessine notre scène

spriteBatch.Begin();

// ...

spriteBatch.End();

// On remet le buffer d'écriture sur l'écran

this.GraphicsDevice.SetRenderTarget(0, null);

// On charge notre Shader

Effect effect = this.Content.Load<Effect>("MonShader");

// Démarage de l'affichage, on commence par le BEGIN du spriteBatch
// puis par celui du Shader pour préparer le Device au rendu

spriteBatch.Begin();
effect.Begin();

// On effectue les passes du Shader (en prenant la texture du render target)

foreach ( EffectPass oPass in effect.CurrentTechnique.Passes )
{
oPass.Begin();
spriteBatch.Draw(renderTarget.GetTexture(), new Vector2(0.0f, 0.0f), Color.White);
oPass.End();
}

// Fin du rendu du Shader

effect.End();
spriteBatch.End();

No Comments

Comments Are Closed