Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [RESOLU]Application de plusieurs shaders  (Lu 1467 fois)

0 Membres et 1 Invité sur ce sujet

aug125

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
[RESOLU]Application de plusieurs shaders
« le: Avril 06, 2014, 01:12:27 pm »
Bonjour !
Je me prends la tête sur les shaders depuis hier, et j'aurais besoin de votre aide :)

Je suis en train de réaliser un petit jeu en écran splitté. en voici un aperçu :



Comme vous le voyez, un pixel shader colore le jeu (mais pas le HUD) en jaune. Je voudrais faire en sorte d'appliquer ce shader sur un seul joueur seulement, ou sur certains joueurs. De plus, j'aimerais appliquer d'autres shaders par la suite.

Et c'est là que je suis complètement bloqué, car malgré mes essais je n'y arrive pas. Je n'arrive à appliquer qu'un Shader à la fois.

Voici le code, simplifié, que j'ai actuellement (je suis passé par pas mal de modifications) :
Course::Course(sf::RenderWindow &appWindow)
{
        RenderTexture appCourse; // Ce RenderTexture contient toutes les sprites appartenant au terrain de jeu (vaisseaux, météorites..), mais pas le HUD (temps, position..)
        appCourse.create(app.getSize().x, app.getSize().y);

        // Initialisation du shader
        m_shader.setParameter("texture", sf::Shader::CurrentTexture);
        m_shader.setParameter("largeur", (float)appWindow.getSize().x);
        m_shader.setParameter("hauteur", (float)appWindow.getSize().y);
        m_shader.loadFromFile("shader.txt", Shader::Fragment);
        m_shader.setParameter("couleur", Color(255,255,0));

// ----------------------------------BOUCLE PRINCIPALE----------------------------------------------
        while(continuer)
        {
                effacerEcran(appWindow);
                effacerEcran(appCourse);
                for (int i=0; i<m_nbJoueurs;i++) // Pour chaque joueur, on dessine les sprites.
                {
                        dessinerTerrain(appCourse, i);
                }
                dessinerShaders(appCourse);
                appliquer(appCourse, app);
                for (int i=0; i<m_nbJoueurs;i++)
                {                      
                        dessinerHUD(appWindow, i);
                }
        }
        afficher(appWindow);
}

void Course::dessinerShaders(RenderTexture &app)
{
        // J'essayais une solution désespérée ici.
        // Normalement j'envoie un paramètre supplémentaire au shader pour qu'il ne fasse pas toujours la même chose à chaque boucle.
        for (int i=0; i<m_nbJoueurs; i++)
        {
                app.display();
                app.draw(sf::Sprite(app.getTexture()), &m_shader);
        }
}

void Course::appliquer(RenderTexture &app, RenderWindow &appWindow)
{
        app.display();
        appWindow.draw(sf::Sprite(app.getTexture()));
}

// Afficher.
void Course::afficher(RenderWindow &appWindow)
{
        appWindow.display();
}

 

Je suis conscient que ce que j'ai écrit dans la méthode dessinerShaders doit être stupide, même si je ne comprend pas tout à fait pourquoi  :-\

Le principe de mon code est d'écrire dans un RenderTexture (appCourse) les éléments de terrain, puis d'appliquer le shader, puis de mettre le tout dans un RenderWindow (appWindow),  et enfin d'écrire le reste directement dans l'appWindow.

J'ai essayé d'utiliser des textures intermédiaires, mais l'instruction
Texture t = app.getTexture();
 
que je mettais dans dessinerShaders fait grandement ramer le jeu.

Voilà, en espérant avoir été assez clair, je vous remercie d'avance pour votre aide !

EDIT : Je me suis débrouillé en faisant en sorte de TOUT faire avec un seul shader.
« Modifié: Avril 07, 2014, 11:47:38 pm par aug125 »