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
.