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

Auteur Sujet: sf::VertexArray et utilisation des Shaders  (Lu 1530 fois)

0 Membres et 1 Invité sur ce sujet

PetitPoney

  • Newbie
  • *
  • Messages: 44
    • Voir le profil
sf::VertexArray et utilisation des Shaders
« le: Septembre 16, 2013, 02:37:43 pm »
Bonjour,

Je suis actuellement en train d'implémenter un système de particule. J'ai donc repris l'exemple fourni dans le tutoriel afin de partir sur une bonne base.

Cependant, j'ai quelques soucis avec l'utilisation de shaders par dessus mon sf::VertexArray.
Mon objectif est d'afficher des particules en forme de cercle à partir d'un seul triange (donc afficher le cercle inscrit à ce triange).
Pour simplifier mon explication (et les calculs) je vais ici utiliser un carré (car ce n'est pas la partie mathématique qui me pose soucis).

Je définis donc mon sf::VertexArray avec une taille de 4 vertex
  // En haut à gauche                                                                                                                                                        
  position.x = _emitter.x - 0.5 * triangleSize;
  position.y = _emitter.y;
  _vertices[indexTmp].position = position;
  _vertices[indexTmp].color = sf::Color::Cyan;
  _vertices[indexTmp++].texCoords = sf::Vector2f(0.0, 0.0);

  // En haut à droite                                                                                                                                                        
  position.x = _emitter.x + 0.5 * triangleSize;
  position.y = _emitter.y;
  _vertices[indexTmp].position = position;
  _vertices[indexTmp].color = sf::Color::Cyan;
  _vertices[indexTmp++].texCoords = sf::Vector2f(1.0, 0.0);

  // En bas à droite                                                                                                                                                        
  position.x = _emitter.x + 0.5 * triangleSize;
  position.y = _emitter.y + triangleSize;
  _vertices[indexTmp].position = position;
  _vertices[indexTmp].color = sf::Color::Cyan;
  _vertices[indexTmp++].texCoords = sf::Vector2f(1.0, 1.0);

  // En bas à gauche                                                                                                                                                        
  position.x = _emitter.x - 0.5 * triangleSize;
  position.y = _emitter.y + triangleSize;
  _vertices[indexTmp].position = position;
  _vertices[indexTmp].color = sf::Color::Cyan;
  _vertices[indexTmp++].texCoords = sf::Vector2f(0.0, 1.0);
 

Pour n'afficher qu'un cercle je passe donc par l'utilisation d'un shader
uniform sampler2D texture;

void main()
{
  vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
  vec2 center = vec2(0.5, 0.5);
  float d = distance(gl_TexCoord[0].xy, center);

  gl_FragColor.r = gl_Color.r * pixel.r;
  gl_FragColor.g = gl_Color.g * pixel.g;
  gl_FragColor.b = gl_Color.b * pixel.b;
  gl_FragColor.a = 1.0;

  if (d > 0.5)
    gl_FragColor.a = 0.0;
}
 

Cependant, rien ne s'affiche à l'écran (en gros la distance est toujours supérieur à 0.5 ..). Je pense que le shader est correct. Je set bien l'adresse de mon shader dans les sf::RenderStates avant de draw.

Selon moi le problème vient donc de ma définition des vertex. Mais je ne comprends pas pourquoi.
Quelqu'un verrait-il d'où vient le problème ? Ce que j'essaie de faire est-il possible au moins ?

Cordialement.


EDIT : Je viens de me rendre compte qu'il faut définir les texCoords en pixel, et non en coordonnées normalisée. Le problème est donc réglé. Si un modérateur trouve comme moi qu'il serait logique d'effacer ce post qu'il ne s'en prive pas :D.
« Modifié: Septembre 16, 2013, 02:54:27 pm par PetitPoney »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : sf::VertexArray et utilisation des Shaders
« Réponse #1 le: Septembre 16, 2013, 02:53:59 pm »
Les coordonnées de texture de sf::Vertex doivent être données en pixels, pas en coordonnées normalisées.

Cependant comme tu n'utilise pas de texture, il n'y a pas de matrice de texture qui est appliquée (qui sert normalement à transformer les coordonnées pixels en coordonnées normalisées), du coup deux cas de figure :

- tu as utilisé une texture auparavant dans ton programme, et c'est sa matrice qui est restée active -> ça ne marche pas
- tu n'utilises aucune texture a aucun moment dans ton programme, et c'est la matrice identité qui est utilisée -> ça devrait marcher (du moins sur cet aspect)

En fait SFML n'est pas vraiment faite pour utiliser des coordonnées de texture sans texture ; ceci-dit le fix devrait être très simple, je vais voir pour corriger ça.

A part ça il y a peut-être d'autres erreurs, mais c'est déjà une piste.

Et sinon, pourquoi ne pas utiliser une texture ? Ca te permettrait d'avoir un disque plus joli, avec des bords anticrénelés ou fondus par exemple.
Laurent Gomila - SFML developer

PetitPoney

  • Newbie
  • *
  • Messages: 44
    • Voir le profil
Re : sf::VertexArray et utilisation des Shaders
« Réponse #2 le: Septembre 16, 2013, 02:58:34 pm »
Citer
Les coordonnées de texture de sf::Vertex doivent être données en pixels, pas en coordonnées normalisées.

Oui je viens tout juste de remarquer le problème.

Citer
- tu as utilisé une texture auparavant dans ton programme, et c'est sa matrice qui est restée active -> ça ne marche pas

En effet j'utilise une texture (un simple carré blanc actuellement) afin de pouvoir utiliser les coordonnées de celle-ci dans mon shader.

Citer
Et sinon, pourquoi ne pas utiliser une texture ? Ca te permettrait d'avoir un disque plus joli, avec des bords anticrénelés ou fondus par exemple.

Utiliser une texture directement par dessus mon triangle ? Oui c'est vrai que je n'y ais même pas pensé. Cela permettrait de passer outre l'utilisation du shader pour la géométrie finale.
Je vais essayer ça.

Merci beaucoup !