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

Auteur Sujet: [Résolu] Probleme avec View + utilisation d'une RenderTexture  (Lu 1995 fois)

0 Membres et 1 Invité sur ce sujet

Despay

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Bonjour,

voila j'ai un petit problème avec ma vue avec l'utilisation d'une RenderTexture.
Dans mon code, je possède un objet Camera qui hérite de View et qui s'occupe de se placer correctement par rapport a mon personnage et de dessiner les sprites censés être dans la scène. Au début je n'utilisais pas de RenderTexture mais ayant pour projet d'utiliser des shaders sur toute ma scene, j'ai changé mon code.

Mon problème est que ma RenderTexture ne se dessine pas la ou il faut, voici 2 images sans/avec utilisation de la RenderTexture :
http://www.noelshack.com/2015-11-1426025436-sans-rendertexture.png
http://www.noelshack.com/2015-11-1426025429-avec-rendertexture.png

Voici le code que j'utilise :
void Camera::dessinerSpriteVisible(Map* map, RenderWindow * app)
{
    Sprite sprite;
    sf::RenderTexture renderTexture;
    if (!renderTexture.create(1920, 1080)){
        cerr << "Erreur initialisation render"<<endl;
        return;
    }
    renderTexture.clear(sf::Color::Red);
   // renderTexture.setView(*this);


    vector<Platforme*> * platformes = map->getPlatformes();
    //on dessine les platformes
    for(unsigned int i = 0 ; i < platformes->size() ; i++)
    {
       if(isVisible((*platformes)[i]))
       {
           renderTexture.draw( *((*platformes)[i]) );
            sprite.setTexture(renderTexture.getTexture());
            renderTexture.display();
            app->draw(sprite);
       }

    }

    vector<Personnage*> * personnages = map->getPersonnages();
    //on dessine les perso
    for(unsigned int i = 0 ; i < personnages->size() ; i++)
    {
        if(isVisible((*personnages)[i]))
       {
            renderTexture.draw( *((*personnages)[i]) );
            sprite.setTexture(renderTexture.getTexture());
            renderTexture.display();
            app->draw(sprite);

       }
    }

    vector<Decor*> * decors = map->getDecors();
     for(unsigned int i = 0 ; i < decors->size() ; i++)
    {
        if(isVisible((*decors)[i]))
       {
            renderTexture.draw( *((*decors)[i]) );
            sprite.setTexture(renderTexture.getTexture());
            renderTexture.display();
            app->draw(sprite);
       }
    }

   // app->setView(renderTexture.getView());

}
 

J'ai essayé de jouer avec 'renderTexture.setView(app->getView())' puis 'app->setView(renderTexture.getView());' mais rien n'y fait, cela ne fonctionne pas correctement  :-\

Quelqu'un pourrait t-il m'expliquer ce que je fais de mal ?

Merci de votre aide !
« Modifié: Mars 11, 2015, 05:30:49 pm par Despay »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Probleme avec View + utilisation d'une RenderTexture
« Réponse #1 le: Mars 10, 2015, 11:44:53 pm »
Si ta RenderTexture prend toute la fenêtre, il n'y a alors aucune raison d'appliquer une vue à ta fenêtre, sinon celle-ci va se retrouver déplacée. C'est à ta RenderTexture que tu dois appliquer la vue qui gère les déplacements etc.

Si tu sais le faire sans RenderTexture, c'est pas plus compliqué de le faire avec une RenderTexture qui prend toute la fenêtre.
Au lieu de tout faire sur ta fenêtre (view, draw, etc.) tu fais TOUT sur ta RenderTexture. Ensuite tu récupères la texture et l'appliques à un sprite que tu dessines (avec ou sans shader) en 0, 0 sur ta fenêtre.

Du coup si tu fais comme j'ai dit, tu te rendras aussi compte que c'est bizarre d'appeler display plein de fois (sans la clear en plus) et de draw plein de fois ton sprite qui représente la RenderTexture, tu ne le faisais pas quand tu utilisais une fenêtre non ? ;)


Schématiquement pour reprendre ton code :

création de la RenderTexture (tu peux le faire qu'une seule fois ailleurs, si tu le fais à chaque fois ça risque d'être lent)
RenderTexture.clear()
RenderTexture.setView(ta caméra)
pour chaque plateforme :
-- RenderTexture.draw(plateforme)
pour chaque perso :
-- RenderTexture.draw(perso)
pour chaque decor :
-- RenderTexture.draw(decor)
RenderTexture.display()
sprite.setTexture(RenderTexture.getTexture())
Fenetre.draw(sprite)
Fentre.display() (éventuellement plus loin)
« Modifié: Mars 10, 2015, 11:50:34 pm par G. »

Despay

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re : Probleme avec View + utilisation d'une RenderTexture
« Réponse #2 le: Mars 11, 2015, 01:34:20 pm »
Merci de ton aide, j'apprécie beaucoup.

J'ai modifié mon code comme tu me l'as conseillé, et c'est surement bien plus rentable comme ça  ;D.

Cependant j'ai toujours le problème de la camera qui ne filme pas au bon endroit.
http://www.noelshack.com/2015-11-1426076692-camera.png

void Camera::dessinerSpriteVisible(Map* map, RenderWindow * app)
{
    Sprite sprite;
    renderTexture.clear(sf::Color::Red);
    renderTexture.setView(*this);


    vector<Platforme*> * platformes = map->getPlatformes();
    //on dessine les platformes
    for(unsigned int i = 0 ; i < platformes->size() ; i++)
    {
       if(isVisible((*platformes)[i]))
       {
           renderTexture.draw( *((*platformes)[i]) );
       }

    }

    vector<Personnage*> * personnages = map->getPersonnages();
    //on dessine les perso
    for(unsigned int i = 0 ; i < personnages->size() ; i++)
    {
        if(isVisible((*personnages)[i]))
       {
            renderTexture.draw( *((*personnages)[i]) );
       }
    }

    vector<Decor*> * decors = map->getDecors();
     for(unsigned int i = 0 ; i < decors->size() ; i++)
    {
        if(isVisible((*decors)[i]))
       {
            renderTexture.draw( *((*decors)[i]) );
       }
    }
    renderTexture.display();
    sprite.setTexture(renderTexture.getTexture());
    app->draw(sprite);


}
 

La camera semble etre centrée sur le 0,0 de la renderTexture, je pourrais peut etre deplacer le sprite.setTexture(renderTexture.getTexture()); de facon a ce que cela soit centré mais n'est ce pas un peu sale ?
D'autre part, j'ai remarqué que la render texture ne se 'deplacait' pas a la même vitesse que mon personnage,
http://www.noelshack.com/2015-11-1426077001-camera2.png
par rapport au screen plus haut ou le personnage est visible, et on voit la totalité de la renderTexture en largeur et http://www.noelshack.com/2015-11-1426077185-camera3.png
« Modifié: Mars 11, 2015, 01:53:09 pm par Despay »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme avec View + utilisation d'une RenderTexture
« Réponse #3 le: Mars 11, 2015, 03:01:17 pm »
Si ton problème concerne le placement de la caméra, peut-être que montrer le code correspondant pourrait aider... ;)
Laurent Gomila - SFML developer

Despay

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re : Probleme avec View + utilisation d'une RenderTexture
« Réponse #4 le: Mars 11, 2015, 03:34:24 pm »
Eh bien mon placement de camera consiste simplement a centrer la camera sur mon personnage (le truc tout gris tout moche sur les screen) a chaque frame avant de dessiner les sprites.
Cela fonctionnait avant que je mette en place ma RenderTexture.
void Camera::rafraichirPositionCamera(RenderWindow *  app)
{
    setCenter(cible->getPosX(),cible->getPosY());
    app->setView(*this);
}
 
« Modifié: Mars 11, 2015, 03:38:20 pm par Despay »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Probleme avec View + utilisation d'une RenderTexture
« Réponse #5 le: Mars 11, 2015, 04:57:18 pm »
Je pense que ton app->setView est de trop, puisque cette vue doit s'appliquer sur la RenderTexture. Si tu modifies la vue de ta fenêtre, alors ton sprite qui contient la RenderTexture va "bouger" alors qu'il est censé couvrir toute ta fenêtre.

Despay

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
    • E-mail
Re : Probleme avec View + utilisation d'une RenderTexture
« Réponse #6 le: Mars 11, 2015, 05:30:32 pm »
C'était effectivement ce qui posait problème, merci beaucoup !

Des bisous.  ;D