|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : octobre 2006 Messages : 11 ![]() |
Bonjour à tous,
je butte sur un problème depuis un petit moment. Je souhaite déterminer l'objet sur lequel je clique, dans un contexte graphique GL. Après avoir essayé la méthode par picking, je me suis intéressé à la méthode des couleurs. La raison principale c'est que j'affiche des QUADS texturés, lesquels peuvent présenter des zones transparentes. Et je souhaite que le click souris sélectionne l'objet le plus proche qui soit non-transparent à cet endroit. J'ai galéré un moment avec les diverses fonctions de transparence, de textures d'environnement, etc.. en vain. Ce que je souhaite c'est tracer mes QUADS en leur affectant une couleur distincte (ce qui me permet de déterminer l'objet sélectionné après le glReadPixels() ) tout en reproduisant les zones de transparence. La solution évidente c'est de recréer des textures unicolores (une couleur distincte par objet) qui reproduise le canal alpha des textures originales. L'ennui c'est que dans ce cas j'aurais à stocker d'un côté les textures originales des QUADS et de l'autre les textures unicolores qui ne servent qu'à la sélection. Je cherchais un moyen pour éviter ça, par exemple en appliquant un facteur quelconque à la texture originale, de sorte que le canal alpha soit appliqué tel quel, mais que les canaux RGB ne montrent plus l'image originale mais juste une couleur particulière.. Je suis prêt à préciser ma pensée si je n'ai pas été clair. Merci pour tout conseil ! GOperto |
|
|
00
|
|
|
#2 |
|
Invité régulier
![]() Inscription : octobre 2006 Messages : 11 ![]() |
Je viens de mettre en oeuvre la "solution évidente" consistant à créer, à part, des textures unicolores reproduisant le canal alpha des textures originales.
Voici une capture du résultat que je souhaite obtenir : ![]() à gauche, j'affiche des QUADS texturés normalement, dont certains présentent une zone transparente au milieu, à droite, j'affiche les mêmes QUADS, présentant les mêmes zones transparentes, mais chaque texture ne montre qu'une seule couleur, ce qui me permet de savoir sur quel objet je clique. Ce que je souhaitais donc, c'est une éventuelle façon de bidouiller le rendu des textures originales de sorte à obtenir le même résultat sans avoir à créer de textures supplémentaires. Je me demandais si c'était possible en trafiquant avec les fonctions glTexEnv(), glBlendFunc(), glColor(), etc.. Voilà, merci d'avance pour toute aide ! |
|
|
00
|
|
|
#3 | ||||||
|
Membre régulier
![]() Inscription : mai 2006 Messages : 159 ![]() |
pour la passe du picking :
ensuite tu dessinnes tes objets en mettant ça avant: Code :
(quand tu dessinnes dans un buffer autre que le front fait un Code :
Code :
|
||||||
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : octobre 2006 Messages : 11 ![]() |
merci pour ta réponse mais ça ne m'aide pas beaucoup : c'est la transparence des textures qui m'intéresse.
Je peux m'éclaircir si besoin est. |
|
|
00
|
|
|
#5 | ||
|
Membre régulier
![]() Inscription : mai 2006 Messages : 159 ![]() |
Code :
|
||
|
|
00
|
|
|
#6 | ||
|
Invité régulier
![]() Inscription : octobre 2006 Messages : 11 ![]() |
En fait, ce n'est pas la réponse que j'attends ou alors je n'ai pas compris.
Tu as l'air de me faire affecter une valeur discriminante à la transparence de chaque objet. Ce que j'explique dans mon post c'est que je souhaite donner une couleur discriminante à chaque objet mais en reproduisant le canal alpha de la texture originale appliquée. C'est facilement réalisable si au départ je crée un ensemble de textures (autant qu'il y a d'objets), chaque texture étant unicolore (d'une couleur permettant de distinguer l'objet parmi les autres) mais reproduisant le canal alpha de la texture que j'applique à mon QUAD dans mon rendu. Ma question c'est est-il possible de trafiquer, par exemple avec les fonctions de rendu de texture citées précédemment, pour éviter de créer ces textures, en gros j'aimerais un truc du genre : Code :
|
||
|
|
00
|
|
|
#7 |
![]() ![]() Développeur informatique Inscription : avril 2003 Messages : 10 652 ![]() |
Y a un truc que je ne comprends pas. Pourquoi vouloir garder l'alpha si c'est pour faire du picking ? D'autant plus que du coup la couleur finale ne sera plus celle que tu auras affectée à l'objet.
__________________
Mieux que SDL : découvrez SFML |
|
|
00
|
|
|
#8 |
|
Invité régulier
![]() Inscription : octobre 2006 Messages : 11 ![]() |
Parce qu'en fait les textures de mes QUADS présentent des zones de transparence. Et par exemple si l'un de mes QUADS représente - admettons - un anneau (dont le centre serait donc transparent), je souhaite qu'en cliquant au centre de l'anneau ce soit non pas l'anneau qui soit sélectionné mais le premier objet non-transparent recouvrant cette zone. L'anneau quant à lui ne serait sélectionné qu'en cliquant sur ses zones non-transparentes (donc sur l'anneau "lui-même" et non pas sur tout son QUAD associé).
Voilà |
|
|
00
|
|
|
#9 |
![]() ![]() Développeur informatique Inscription : avril 2003 Messages : 10 652 ![]() |
Ok. Dans ce cas utilise plutôt l'alpha-test, ce sera plus économique que l'alpha-blending.
Ensuite je pense qu'effectivement il faut bien paramétrer les unités de texture. Je saurais le faire avec DirectX, mais pas avec OpenGL... désolé
__________________
Mieux que SDL : découvrez SFML |
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() |
__________________
Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/ |
|
00
|
|
|
#11 |
|
Expert Confirmé
![]() ![]() Tony BAYARTIngénieur développement logiciels Inscription : avril 2005 Messages : 2 198 ![]() |
la transparence c'est bon pour l'affichage
pour du picking, on ne fait pas de rendu de transparence
|
|
00
|
|
|
#12 |
|
Membre du Club
![]() |
Raptor => j'ai bien réussi à faire le picking color mais pour reprendre l'exemple du topic que j'ai relancé, imaginons un anneau, si on clicke au centre de l'anneau, celui ci ne doit pas être sélectionné
Shenron => même en trafiquant les glTexEnv comme suggéré plus ? Merci quand même ! |
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() ![]() Julian IbarzIngénieur développement logiciels Inscription : avril 2006 Messages : 449 ![]() |
Il y a deux choses différentes avec la composante alpha : l'alpha test qui consiste à afficher un pixel en fonction de sa valeur en alpha et le blending. Tu peux donc très bien garder l'alpha test qui permet de faire des trous dans ton anneau (en désactivant le blending) pour faire du picking color.
Tu fais donc une génération de ton id sur les composantes rgb de ton objet (ou plutôt de la texture sur ton objet) et tu gardes les composantes alpha de ta texture originale... Ceci oblige à générer une texture d'identifiant pour chaque objet utilisant l'alpha test pour son rendu. Ca prend donc deux fois plus de mémoire... Je ne sais pas s'il y a des techniques moins coûteuses... C'est une proposition comme ça |
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() ![]() Tony BAYARTIngénieur développement logiciels Inscription : avril 2005 Messages : 2 198 ![]() |
Tout d'abord, est-ce que tu as cherché un peu sur le forum les sujets sur le picking et ceux sur le color picking ?
concernant l'alpha, il n'a rien à faire dans un rendu de picking ni alpha test ni alpha blending la raison en est simple, tu veux détecter la sélection d'un élément par rapport à une couleur prédéterminée comment veux tu connaitre la couleur de l'anneau si celui-ci est une texture ? ![]() ou alors ta texture doit être un masque, et encore la phase de modulation de la texture avec la couleur de l'objet sera faussée bref, pour un algorithme de picking tu dois dessiner chaque élément sélectionnable avec une couleur bien précise de manière à ce que le pixel que tu récupères soit de la couleur que l'objet que tu es sensé détecter si tu fais un et que tu récupère un pixel de la couleur 201,0,0 tu fais comment ? tu peux toujours prendre une marge mais ça limite tes possibilités - désactiver les textures - désactiver le dithering (qui fausse les couleurs) - utiliser glColor3ub pour définir la couleur de l'objet - désactiver le blending / alpha test sont des conditions primordiales au bon fonctionnement d'un color picking Tutorial en anglais sur le color picking |
|
00
|
|
|
#15 |
|
Membre Expert
![]() ![]() Julian IbarzIngénieur développement logiciels Inscription : avril 2006 Messages : 449 ![]() |
En quoi l'alpha test fausse le picking shenron ? Je veux bien te croire lorsque tu dis qu'il faut le supprimer pour que tout fonctionne bien mais pourquoi ? Tu n'as toujours pas fourni d'arguments qui contredise la possibilité de son utilisation, enfin de ce que j'ai compris
Il n'est pas possible d'appliquer une texture à un objet de telle sorte que lors du rendu la couleur de la texture ne soit pas modifiée par le "matériau" de l'objet ? Dans ce cas faire un alpha-test ne pose aucun problème non ? Il faut juste bien sûr donner une texture remplie de la couleur de l'id avec l'alpha de la texture d'origine comme je le dis dans mon précédent post. |
|
00
|
|
|
#16 |
|
Membre du Club
![]() |
TanEK m'a précédé je me pose la même question, en quoi un alpha test ne fonctionne pas, je dois avouer que je n'ai pas bien compris ton explication
Autre idée avant d'abandonner la chose pourquoi ne pas faire en 2 passes : - Dessin de la texture normale avec alpha test dans le stencil buffer - Dessin du quad pour le color picking en tenant compte de ce qui a été mis dans le stencil C'est peu être totalement déconnant, je lance l'idée (mais comme je suis une quiche avec le stencil, je ne suis pas prêt de la mettre en oeuvre) |
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() ![]() Julian IbarzIngénieur développement logiciels Inscription : avril 2006 Messages : 449 ![]() |
C'est une très bonne idée ! C'est beaucoup plus facile à implémenter, ça prend moins de mémoire mais c'est un peu plus lent (nécessite deux passes). Voire si tu n'as pas besoin du stencil pour le rendu ça prendrait un temps additionnel nul ! Tu l'actives par défaut et tu t'en sers qu'au picking. Essaye
|
|
00
|
|
|
#18 | ||
|
Membre du Club
![]() |
Et hop aussitôt dit aussitôt fait j'ai testé le machin
Et force est de constater que cela ne marche pas... Le qualité du color picking a diminué, sur certaines textures ça marche, sur d'autres non. Code :
Si l'un d'entre vous voit ce qui merde. Je suis super nul avec le stencil, j'ai ptêt raté un épisode
|
||
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() ![]() Julian IbarzIngénieur développement logiciels Inscription : avril 2006 Messages : 449 ![]() |
Peut-être le fait de désactiver le glColorMask ça casse la chaîne de pipeline ? C'est pas grave tu sais si tu écris à l'écran, tu vas réécrire par dessus donc ça pose aucun pb. Au pire du erase le color buffer avant la deuxieme passe.
|
|
00
|
|
|
#20 |
|
Membre du Club
![]() |
Non malheureusement ça ne change rien...
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com