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

Auteur Sujet: [SFML 2.0] Transparence localisée sur un sprite  (Lu 6949 fois)

0 Membres et 1 Invité sur ce sujet

LD_FLO

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
[SFML 2.0] Transparence localisée sur un sprite
« le: Juillet 13, 2012, 07:37:40 pm »
Bonjour, je programme un jeu depuis un certain temps (style action RPG), et je souhaiterais obtenir de l'aide sur ceci:

Lorsque mon personnage passe derrière un arbre (par exemple), il est caché. Je dois donc  faire varier la transparence de l'arbre pour que mon personnage puisse être perçu. J'arrive à le faire mais uniquement sur la totalité de l'arbre.

J'aimerais que la transparence de l'arbre s'effectue sur un cercle décrit autour de mon personnage et de façon "smoothée", c'est à dire que les bordures du cercle soient moins transparente que le centre (si vous voyez ce que je veux dire).
Comment faire de façon optimisée ? Il y a t-il des fonctions préétablies pour ce genre de chose ?

Je ne veux pas forcément du code brut: des noms de fonctions ou la description du fonctionnement d'un algorithme me suffiront, je me débrouillerai pour le reste.

Merci d'avance, et si vous avez besoin de précisions, n'hésitez pas.


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #1 le: Juillet 13, 2012, 08:44:59 pm »
C'est pas forcément ultra-simple à mettre en oeuvre. Surtout avec SFML. Là comme ça, la seule solution viable que j'ai en tête c'est de passer par un shader.
Laurent Gomila - SFML developer

LD_FLO

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #2 le: Juillet 13, 2012, 09:14:11 pm »
Merci de ta réponse.
Donc la solution serait de récupérer tous les pixels à l'intérieur du cercle pour modifier un à un leur valeur de transparence en post effect ? Ça me parait couteux en termes de ressources

danman

  • Hero Member
  • *****
  • Messages: 1121
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #3 le: Juillet 13, 2012, 10:26:28 pm »
c'est au final ce que tu ferais en temps normal ;)

EDIT: pardon, ce que je veux dire, c'est que dans tous les cas il faut bien changer la transparence de ces points a un moment.
Pointilleur professionnel

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #4 le: Juillet 13, 2012, 10:48:45 pm »
Citer
Donc la solution serait de récupérer tous les pixels à l'intérieur du cercle pour modifier un à un leur valeur de transparence en post effect ? Ça me parait couteux en termes de ressources
Dit comme ça, ça sonne faux. Tout ce que tu as à faire c'est écrire le pixel shader qui va bien (pas trop compliqué a priori -- on peut en parler si tu veux) et l'appliquer sur le sprite qui recouvre ton personnage.
Laurent Gomila - SFML developer

LD_FLO

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #5 le: Juillet 14, 2012, 11:24:27 am »
Je veux bien en parler, j'ai du mal à comprendre leur fonctionnement (et c'est pas faute d'avoir essayé)

Merci  ;D

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #6 le: Juillet 14, 2012, 05:53:09 pm »
Normalement, la carte graphique a une chaîne bien définie de fonctions à exécuter successivement pour afficher quelque chose (on va dire un sprite, puisque c'est ce qui nous intéresse ici). Or parfois ces fonctions sont trop figées, tu n'arrives pas à faire exactement ce que veux simplement en changeant les attributs de dessin qui sont disponibles. C'est le cas ici.

Du coup tu peux dire à la carte graphique : "au lieu d'exécuter les fonctions prédéfinies, exécute ce petit programme que j'ai écrit". Le petit programme c'est un shader. Et comme tu peux y faire à peu près ce que tu veux, les limites sautent et tu peux très facilement créer un effet qui aurait été très compliqué, voire impossible, à faire avec les fonctions "normale".

Un pixel shader est appelé pour chaque pixel du sprite à dessiner. Tu reçois en entrée de ton programme les infos sur le pixel, et tu dois renvoyer le pixel final à dessiner. Il est dès lors très facile d'implémenter ton effet : selon la distance entre le centre de ton cercle (qu'il faudra du coup passer au shader explicitement -- un peu comme une variable globale) et le pixel, tu vas modifier la valeur alpha de celui-ci pour le rendre plus ou moins transparent.
Laurent Gomila - SFML developer

LD_FLO

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #7 le: Juillet 15, 2012, 01:23:20 pm »
Merci beaucoup, je pense pouvoir me débrouiller maintenant. A moi de trouver les formules !

LD_FLO

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #8 le: Juillet 16, 2012, 03:26:47 pm »
Je suis face à un autre problème:

Le shader nécessite une texture (en paramètre), or mon objet est un sprite, et la seule fonction capable de récupérer la texture de celui-ci délivre un pointeur de la texture. Comment faire pour récupérer la texture dans son intégralité pour l'utiliser avec le shader ? Il y a t-il un autre moyen ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #9 le: Juillet 16, 2012, 03:31:27 pm »
Tu peux dire au shader d'utiliser la texture de l'objet qui est en train d'être dessiné :
shader.setParameter("texture", sf::Shader::CurrentTexture);
Comme ça tu n'as pas à la spécifier toi-même explicitement.

Donc au moment où tu vas dessiner un sprite, implicitement c'est à la texture de ce sprite que tu vas accéder dans ton shader.

N'hésite pas à regarder l'exemple "Shader" du SDK SFML.
Laurent Gomila - SFML developer

LD_FLO

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #10 le: Juillet 16, 2012, 03:53:50 pm »
Sauf que j'ai énormément d'objets différents dessinés, et tous ne bénéficient pas de l'effet. Mais "window.draw(sprite, shader);" est très efficace, je regarderai la documentation plus attentivement avant de poster ;D
Merci pour ta réponse rapide (et SFML c'est de la bombe (soit dit en passant ;)))

LD_FLO

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #11 le: Juillet 17, 2012, 02:32:20 pm »
Je peine à comprendre le langage GLSL, j'ai fait le tour du web, et les tutos n'abordent absolument pas (du moins explicitement) ce que je veux, et les exemples sont d'une rareté ...

Par exemple, j'ai ce code, qui rend l'image en noir et blanc:

uniform sampler2D texture;
void main()
{
   //C'est cette ligne qui m'intrigue
   vec4 texel = texture2D(texture, gl_TexCoord[0].st);

   //Peut être celle-ci aussi ::)
   vec4 pixel = texel * gl_Color;

   float gray = pixel.r * 0.39 + pixel.g * 0.50 + pixel.b * 0.11;
   gl_FragColor = vec4(gray ,gray ,gray ,pixel.a);
}

Comment faire dès lors, pour sélectionner qu'une partie de la texture, genre un carré, pour lui faire subir l'effet ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #12 le: Juillet 17, 2012, 04:58:58 pm »
Dans un shader tu ne traites qu'un seul pixel à la fois. Chacune des fonctions qui sont appelées ne concernent que le pixel en cours -- et le shader est ensuite executé autant de fois qu'il y a de pixels dans l'entité que tu dessines.

C'est comme si ton main() prenait un pixel en paramètre, sauf que le pixel en question est défini par les variables globales gl_TexCoord, gl_Color, etc.
Laurent Gomila - SFML developer

LD_FLO

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #13 le: Juillet 17, 2012, 05:38:39 pm »
D'accord, et concrètement si je souhaite modifier que le pixel en haut à gauche de ma texture par exemple, comment dois-je m'y prendre ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Transparence localisée sur un sprite
« Réponse #14 le: Juillet 17, 2012, 08:57:23 pm »
C'est un peu plus compliqué que ça, en l'occurence tu n'as pas accès directement à la position du pixel. Ce n'est pas difficile à gérer, mais si je te donnais la solution toute cuite tu ne comprendrais probablement pas, du coup je te recommande de te familiariser un minimum avec les shaders avant de continuer.

Je sais que c'est pas terrible comme réponse, mais si tu pars à l'aveugle dans les shaders tu vas vite heurter un mur :)
Laurent Gomila - SFML developer