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

Auteur Sujet: Diviser deux textures.  (Lu 5006 fois)

0 Membres et 1 Invité sur ce sujet

LEpigeon888

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Diviser deux textures.
« le: Mars 14, 2014, 11:40:01 pm »
Bonjour.

Alors en fait, je cherche à savoir si il était possible (et si oui comment) de diviser deux texture, enfin les couleurs de ces deux textures. J'ai cherché et j'ai trouve qu'il y avait ça http://www.sfml-dev.org/documentation/2.1/group__graphics.php#ga80c52fe2f7050d7f7573b7ed3c995388 mais rien ne correspond à ce que je cherche (Dest / Source, dans le cas ou Source est l'image que l'on veut dessiner, j'suis pas sur que ce soit ça dans la doc donc je précise).

Je sais que je pourrais utiliser les shaders pour ça, en passant la texture qui est le diviseur, ce que j'ai essayé mais ça a pas très bien marché :

uniform sampler2D texture;

void main()
{
        gl_FragColor =  gl_Color / texture2D(texture, gl_TexCoord[0].xy);
}

En fait j'ai pas très bien compris ce qu'il se passe, je crois que ça récupère les coordonnée de la texture mais relativement au sprite que je veux dessiner, et pas par rapport à sa position relativement à la fenêtre.

Donc, avant de ne pencher plus sur la question des shaders, j'aimerais savoir si la SFML n'a pas déjà une solution toute faites, histoire que je galère pas pendant deux heure alors que la solution était toute simple. Merci d'avance aux personnes qui essaieront de m'aider.
« Modifié: Mars 16, 2014, 05:12:04 pm par LEpigeon888 »

math1992

  • Jr. Member
  • **
  • Messages: 77
    • Voir le profil
    • E-mail
Re : Divisé deux textures.
« Réponse #1 le: Mars 15, 2014, 03:45:24 am »
Si j'ai bien compris ta question, tu veux diviser pixels par pixels une texture à partir des pixels d'une autre. Si tel est le cas, alors non il n'a rien de fait pour cela.

Tout d'abord, divisé deux couleurs (pixels) (sf::Color), ce n'est pas possible, il faut plutôt diviser chaque paramètre «r, g, b, alpha » par les «r, g, b, alpha » de l'autre texture.

Un problème possible est si un pixel de l'autre texture a un paramètre qui est 0 par exemple, (0, 0, 0, 255), c'est-à-dire noir et opaque, cela va générer une erreur arithmétique. (Division par zéro). C'est en fait pourquoi il n'est pas vraiment possible de divisé deux textures.

Spécifier le pourquoi tu veux diviser deux textures pourrait nous permettre de t'aider à trouver une meilleure solution.

Finalement, un option envisageable (qui peut toujours mener à une exception arithmétique et qui utilise beaucoup de ressource mémoire) est de créer deux images, sur lesquels on peut facilement obtenir les pixels, et faire la division. Avec le résultat obtenu tu crées une troisième image que finalement tu convertit en texture.


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Divisé deux textures.
« Réponse #2 le: Mars 15, 2014, 08:51:10 am »
Peut-être qu'en expliquant de manière plus globale ton problème (-> tu veux faire quoi ?) on pourra te proposer une solution plus pertinente. Parce que là, "diviser deux textures", je t'avoue que ça paraît bien mystique...
Laurent Gomila - SFML developer

LEpigeon888

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Diviser deux textures.
« Réponse #3 le: Mars 15, 2014, 12:25:26 pm »
Citer
Tout d'abord, divisé deux couleurs (pixels) (sf::Color), ce n'est pas possible, il faut plutôt diviser chaque paramètre «r, g, b, alpha » par les «r, g, b, alpha » de l'autre texture.

Oui c'est ce que je voulais dire.

En gros, j'avais déjà fais un moteur de lumière suivant ce principe : http://gregouar.developpez.com/tutoriels/jeux/moteur-lumieres-dynamiques-2d/ (en gros, on crée une texture noir sur laquelle on dessine les lumière, puis on l'applique avec un blendmode multiply).

J'ai vu quelqu'un proposer d'inverser les couleur (donc blanc pour zone sombre et noir pour zone éclairée) et du coups au lieu de multiplier les deux textures, les diviser. Pour illustrer ces propos cette personne a posté cette image : http://sournoishack.com/uploads/571822155fzrhsrdh.png

Je trouve le résultat bien meilleur, ça donne une lumière plus réaliste, pour reprendre ses propos (en gros), une lumière qui éclaire et non une lumière qui ne fait que dissiper les zones d'ombre (comme dans le tuto de developpez.com). Du coups j'aurais aimer implémenter ça mais je sais pas comment.

Citer
Finalement, un option envisageable (qui peut toujours mener à une exception arithmétique et qui utilise beaucoup de ressource mémoire) est de créer deux images, sur lesquels on peut facilement obtenir les pixels, et faire la division. Avec le résultat obtenu tu crées une troisième image que finalement tu convertit en texture.

Justement, j'aurais besoin d'un truc qui ne consomme pas beaucoup. Parce que oui j'ai oublié de préciser dans mon 1er message (mais j'imagine que ça se devine par rapport à ce que j'ai dis avant) mais je veux pas que ce soit trop lent vu que c'est censé être fait à chaque frame.
« Modifié: Mars 16, 2014, 05:12:48 pm par LEpigeon888 »

kimci86

  • Full Member
  • ***
  • Messages: 127
    • Voir le profil
Re : Divisé deux textures.
« Réponse #4 le: Mars 15, 2014, 03:33:03 pm »
Cela peut être utile:
Documentation GIMP

LEpigeon888

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Diviser deux textures.
« Réponse #5 le: Mars 15, 2014, 04:22:28 pm »
Pas vraiment, si je dois utiliser les shaders je sais comment faire pour obtenir la couleur du pixel résultant de la division. Mon problème c'est plus de savoir comment faire ça sans utiliser les shaders, ou alors comment récupérer les bonnes coordonnées des pixels de ma texture (qui fait la taille de la fenêtre) pour l'appliquer au sprite que je dessine.

Normalement mon shader est censé fonctionner (j'ai oublié la division par 0 par contre je suis d'accord) en partant du principe que les couleur sont codé sur un intervalle entre 0 et 1, mais vu que je n'arrive pas à récupérer la bonne position du pixel de la texture que je veux, avant d'essayer de chercher plus en détaille comment faire je voulais savoir si il n'y a pas une solution plus simple, histoire de pas faire compliqué pour rien.

J'espère pour le coup avoir été plus claire dans mes propos.
« Modifié: Mars 15, 2014, 08:27:22 pm par LEpigeon888 »

math1992

  • Jr. Member
  • **
  • Messages: 77
    • Voir le profil
    • E-mail
Re : Diviser deux textures.
« Réponse #6 le: Mars 16, 2014, 03:44:40 am »
J'ai vu quelqu'un proposer d'inverser les couleur (donc blanc pour zone sombre et noir pour zone éclairée) et du coups au lieu de multiplier les deux textures, les divisé.

Si tu veux inverser les couleurs, pourquoi ne pas faire

255 - UneCouleur.r;
255 - UneCouleur.g;
255 - UneCouleur.b
 

Sans toucher à la transparence, on ne veut pas que du opaque devienne du transparent.

Bien sûr cela est valide sur un sf::Color, mais si tu utilise les Shaders, fait plutôt 1 - Valeur en rouge, 1 - Valeur en vert, etc. Cela transformera les couleurs pâles en foncé et les foncées en pâle. Par contre, les couleurs centrales ( ~ (125, 125, 125, 255 ) ) ne vont pas beaucoup changé.



« Modifié: Mars 16, 2014, 03:50:47 am par math1992 »

LEpigeon888

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Diviser deux textures.
« Réponse #7 le: Mars 16, 2014, 05:10:55 pm »
Nan mais, le problème c'est pas d'inverser les couleurs, ça je sais faire, c'est de diviser ces couleurs.

math1992

  • Jr. Member
  • **
  • Messages: 77
    • Voir le profil
    • E-mail
Re : Diviser deux textures.
« Réponse #8 le: Mars 16, 2014, 10:01:12 pm »
J'essai de te convaincre que diviser deux textures n'est pas la solution, mais bon. Il faudrait que je voit le site sur lequel il dise de diviser deux textures, peut-être que ce n'est pas une division arithmétique dont il parle.

Parce-que perso, si l'on divise un nombre disons 1 par un nombre entre 0 et 1, le résultat est plus grand que 1, ce qui n'est pas valide. Bien sûr, on peut prendre modulo 1, mais cela ne donnera pas le résultat escompter.


LEpigeon888

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Diviser deux textures.
« Réponse #9 le: Mars 16, 2014, 10:22:48 pm »
Citer
Parce-que perso, si l'on divise un nombre disons 1 par un nombre entre 0 et 1, le résultat est plus grand que 1, ce qui n'est pas valide. Bien sûr, on peut prendre modulo 1, mais cela ne donnera pas le résultat escompter.

Si la composante est supérieur à 1 elle est tout simplement considéré comme un 1 automatiquement par openGL.

Et si si, c'est bien une division normale dont il parle (en codant les couleurs sur l'intervalle 0-1, et pas 0-255 je précise).
« Modifié: Mars 16, 2014, 10:26:57 pm par LEpigeon888 »

math1992

  • Jr. Member
  • **
  • Messages: 77
    • Voir le profil
    • E-mail
Re : Diviser deux textures.
« Réponse #10 le: Mars 16, 2014, 10:29:47 pm »

Si la composante est supérieur à 1 elle est tout simplement considéré comme un 1 automatiquement par openGL.


Alors, la majorité des nombres vont être envoyés sur 1. Donc, sur blanc. Comme j'ai dit, il faudrait que je voit le site sur lequel il en parle, parce-que, je digère mal qu'une division de texture donc quelque chose de valide.

LEpigeon888

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Diviser deux textures.
« Réponse #11 le: Mars 16, 2014, 10:30:49 pm »
Citer
Alors, la majorité des nombres vont être envoyés sur 1. Donc, sur blanc.

C'est le but justement, que la texture soit plus clair (et même blanche aux endroits ou la texture "diviseur" est noire).

Et si tu veux les liens des messages de la personne :
http://www.jeuxvideo.com/forums/1-31-8353780-337-0-1-0-0.htm#message_8677912
http://www.jeuxvideo.com/forums/1-31-8353780-338-0-1-0-0.htm#message_8677915

Après je vois pas vraiment en quoi ça peut t'avancer mais bon.
« Modifié: Mars 16, 2014, 10:37:16 pm par LEpigeon888 »

math1992

  • Jr. Member
  • **
  • Messages: 77
    • Voir le profil
    • E-mail
Re : Diviser deux textures.
« Réponse #12 le: Mars 16, 2014, 10:41:41 pm »
C'est le but justement.

Comme cette partie est éclaircie, parlons d'une façon d'obtenir les pixels. Sur le tutoriel de SFML, sur la partie des textures, il est clairement spécifié que puisque les textures vives sur la carte graphique, il n'est pas possible de rapidement accéder aux pixels. De plus, un problème avec les Shaders, c'est que ce ne sont pas tous les ordinateurs qui les supportent. La preuve, mon ordinateur ne les supporte pas.

Alors, si ton but est de créer une bibliothèque, ou un programme pour plusieurs ordinateurs, les shaders sont à éviter.

Ce qui, malheureusement, nous ramène à la solution lourde des images.

Malgré cela, si tu tiens toujours aux shaders, je ne peux pas t'aider à ce sujet.   :-[

Finalement, que se passe-t'il lorsqu'on doit diviser par 0, on met la valeur 1 par défaut dans le catch( Exception& E ){}?


LEpigeon888

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Diviser deux textures.
« Réponse #13 le: Mars 16, 2014, 11:11:36 pm »
Citer
Finalement, que se passe-t'il lorsqu'on doit diviser par 0, on met la valeur 1 par défaut dans le catch( Exception& E ){}?

Non, suffit d'ajouter une petite valeur (genre 0.001) à la texture "diviseur" pour qu'elle ne contienne aucun 0.

Après je tien pas spécifiquement à utiliser les shaders, je demande justement comment faire sans (si c'est possible).

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Diviser deux textures.
« Réponse #14 le: Mars 16, 2014, 11:36:08 pm »
Vu qu'apparemment ce n'est pas clair à 100% : tu ne peux pas le faire sans shader ;)
Laurent Gomila - SFML developer