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

Auteur Sujet: sf::Shader, gestion de la texture à utiliser  (Lu 1943 fois)

0 Membres et 1 Invité sur ce sujet

PetitPoney

  • Newbie
  • *
  • Messages: 44
    • Voir le profil
sf::Shader, gestion de la texture à utiliser
« le: Septembre 23, 2013, 11:46:50 pm »
 >:(. La déconnexion/reconnection du forum ne gère pas les messages en cours d'écriture... Je me suis fais avoir  :D.

Bref Bonjour !  :)

J'ai un petit soucis de compréhension au niveau de l'application de texture avec les shaders.
Voilà un bout de "code" réprésentant la chronologie du soucis que je vais évoquer (je peux eventuellement faire un code minimal si néscessaire)

// Definitions                                                                                                                                                                                
sf::Shader shader1;
sf::Shader shader2;
shader1.loadFromMemory("...")
shader2.loadFromMemory("...")

sf::RenderTexture buffer1;
sf::RenderTexture buffer2;
buffer1.create(500, 500);
buffer2.create(500, 500);

sf::CircleShape circle;
circle.setRadius(42);
circle.setTexture(textureLoadedFromMemory)
// Fin des définitions                                                                                                                                                                        

// Je set la première texture                                                                                                                                                                
shader1.setParameter("texture", *circle.getTexture());

// J'applique mon premier shader                                                                                                                                                              
buffer1.draw(circle, &shader1);

// Je crée un sprite temporaire pour l'application                                                                                                                                            
// du deuxième shader en lui attribuant la                                                                                                                                                    
// texture qui résulte du draw précédent                                                                                                                                                      
sf::Sprite tmp;
tmp.setTexture(buffer1.getTexture);

// J'applique mon deuxième shader                                                                                                                                                            
buffer2.draw(circle, &shader2)

// Même chode que pour tmp                                                                                                                                                                    
sf::Sprite tmp2;
tmp2.setTexture(buffer2.getTexture);

// J'affiche le résultat à l'écran                                                                                                                                                            
window.draw(tmp2);
 

Comme on peut le constater, je ne passe qu'une texture sur mon premier shader. Or le tutoriel explicite clairement qu'il faut pour chaque shader indiquer la texture a utiliser avec notamment sf::Shader::CurrentTexture. Or, ce "paramètre spécial" ne semble pas fonctionner de mon côté..

De plus, cette chronologie fonctionne parfaitement dans mon projet. Mes deux shaders sont bel et bien appliqué l'un à la suite de l'autre (avec l'accumulation des deux bien sûr).

J'en arrive donc à mes questions :
  • Est-ce que le fait d'assigner une texture à un Drawable est suffisant pour l'utilisation de cette texture dans un shader ?
  • A quel moment sont bind les textures (plus par curiosité openGL on va dire  :) )
  • Comment se comporte draw lorsque qu'on utilise sf::Shader::CurrentTexture (car dans mon code ça ne semble pas fonctionner) ?
  • Peut-il y avoir des problèmes d'accès concurenciels au niveau des shaders ?

Merci de m'avoir lu.

Cordialement
« Modifié: Septembre 24, 2013, 12:36:41 am par PetitPoney »

Hypnéos

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : sf::Shader, gestion de la texture à utiliser
« Réponse #1 le: Septembre 24, 2013, 12:40:34 pm »
Premier et troisième points :
Citation de: Documentation SFML 2.1 : sf::Shader::CurrentTextureType Struct Reference
Special type/value that can be passed to setParameter, and that represents the texture of the object being drawn.
CaD : la texture pointée par le RenderStates au moment du dessin.

exemple d'utilisation :
sf::Shader shader;

sf::Sprite sprite1,sprite2;

shader.SetParameter("texture", shader.CurrentTexture );


renderTarget.draw( sprite1, &shader );
// utilise la texture de sprite1

renderTarget.draw( sprite2, &shader );
// utilise la texture de sprite2
 

Je t'invite à aller regarder toi-même dans le code-source de SFML pour comprendre son fonctionnement.

Deuxième point :
Je crois avoir compris que ça ce passe lors de l'appel à Draw(), si la texture utilisée lors du dernier appel est différente.

Quatrième point :
Je ne suis pas un pro, mais ne pense pas que ce soit un problème.
Quelqu'un d'autre pourra t'en dire plus.


Je ne peut pas savoir à l'avance, mais un code minimal serait peut-être plus pratique.
Tu obtient une erreur ?


En espérant avoir aidé.  :)

PS: SetParameter() prend un pointer comme argument;
tu as oublié les parenthèses des deux derniers getTextures();

PetitPoney

  • Newbie
  • *
  • Messages: 44
    • Voir le profil
Re : sf::Shader, gestion de la texture à utiliser
« Réponse #2 le: Septembre 30, 2013, 01:53:45 pm »
Bonjour !

Bon du coup j'ai repris depuis le début l'implémentation de mes shader car c'était bien trop bancal à mon goût.
J'utilise maintenant le paramète sf::Shader::CurrentTexture avec succès ! C'est tellement plus simple et pratique. Surtout lorsqu'on utilise plusieurs texture pour appliquer plusieurs shader.

Aussi, j'ai changer mon chargement des shader.
Avant, je ne chargais qu'une seul fois le shader dans un singleton, et j'utilise le même pour plusieur objet et forcément ma gestion des paramètres était "bordelique" si je peux m'exprimer ainsi.
Désormais, je le recharge à chaque nouvel objet. Je ne pense pas que cela affectera les performances du programme.

Merci des réponses en tout cas !

Cordialement