[Open-Gl] Transparence (Débutant)

Transparence (Débutant) [Open-Gl] - C - Programmation

Marsh Posté le 02-02-2004 à 17:22:57    

Bonjour,
 
Je débute en OpenGL (J'ai débuté ce dimanche) et j'ai un petit problème de transparence.
Le problème est le suivant :
 
Si on considère qu'un cube a été dessiné, et que chaque face est transparente d'environ 20%, si deux faces se superposent, il devrait être possible de voir au travers. Or, dans mon petit "programme", ce n'est pas représenté tel quel. Une face est bien transparente (on voit ce qu'il y a à l'intérieur) mais la superposition de deux faces n'est pas transparente, et il y a aussi quelques problèmes de profondeur (entre les faces, justement).
 
Voici la parcelle de code concernée :

Code :
  1. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  2. glColor4fv(transpa);
  3. glutSolidCube(8);


 
Si une âme charitable pouvait m'orienter ?
 
Le programme est (peut-être) disponible ici :
http://audio.lexpage.net/lexpage/perso/carre_3d.exe
 
Merci


---------------
Guybrush  
Reply

Marsh Posté le 02-02-2004 à 17:22:57   

Reply

Marsh Posté le 02-02-2004 à 17:24:15    

ben les blemes de profondeurs sont communs avec la transpa, fo rendre tes faces en back to front
tu veux nous mettre un screenshot (plutot que l'exe) pour bien qu'on voye ?

Reply

Marsh Posté le 02-02-2004 à 19:31:54    

chrisbk a écrit :

ben les blemes de profondeurs sont communs avec la transpa, fo rendre tes faces en back to front
tu veux nous mettre un screenshot (plutot que l'exe) pour bien qu'on voye ?


 
Voici une image de l'exe :  
http://audio.lexpage.net/lexpage/perso/carre_3d.gif
 
On voit très nettement que la transparence n'est gérée que sur un seul niveau, et n'est même pas calculée "correctement".  
 
Dans le cas d'un cube en rotation, comment peut-on savoir à l'avance quelle sera la face la plus éloignée du point de vue ?


---------------
Guybrush  
Reply

Marsh Posté le 02-02-2004 à 21:01:34    

rajoute glAlphaFunc(GL_GREATER,alpha); ==> alpha est un reel compris entre 0 et 1 qui represente le coeffiscient d'opacité ou un truc comme ca (enfin ca laisse passer uniquement les alphas superieurs a ta variable aplha)

Reply

Marsh Posté le 02-02-2004 à 22:28:33    

Mmmh, j'ai "honte" de dire cela, sans artifice, mais "ça ne marche pas" a première vue...
Le comportement est totalement identique, quelque soit la valeur d'alpha dans glAlphaFunc.
 
N'y a t'il pas un éventuel paramètre à modifier ci-dessous ?
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
Merci


---------------
Guybrush  
Reply

Marsh Posté le 02-02-2004 à 22:55:10    

Si tu rends un cube, tu changes le culling pour afficher les faces cachées (en fait celle de derrière), puis les faces visibles (devant).
 
Pour plus complexe, du tri ou du 'depth peeling'.

Reply

Marsh Posté le 02-02-2004 à 23:08:28    

Guybrush02 ==> le test alpha est activer?
glEnable(GL_ALPAH_TEST);  

Reply

Marsh Posté le 03-02-2004 à 07:19:09    

Guybrush02 a écrit :


Dans le cas d'un cube en rotation, comment peut-on savoir à l'avance quelle sera la face la plus éloignée du point de vue ?


 
la réponse est inclue dans la question:
on ne peut pas savoir à l'avance puisque le cube est en rotation.
 
Laisse tomber glutSolidCube qui n'en a rien a faire du fait que tes faces soient transparentes
et trace tes faces de cube comme un homme (avec glVertex..).
 
Bien entendu  
1: tu fais le tri à la main de tes faces. Ce n'est pas franchement dur pour un cube. C'est non trivial parfois impossible pour un mesh quelconque mais ce n'est pas ton probleme.
2: tu le recalcules à chaque image (cf remarque initiale puisque ton cube est en rotation, l'ordre des faces changent à chaque image)
3: Pour ce qui est des balles qui trainent au milieu de ton cube, il faut faire attention de les tracer entre les faces du fond et les faces du devant. Bien entendu le nombre de faces du devant varie entre 1 et 3 suivant l'orientation.
 
A+
LeGreg

Reply

Marsh Posté le 03-02-2004 à 17:05:36    

Je vois.
Merci pour ces explications, je vais m'attacher à ce problème en tenant compte de vos remarques.
 
Une petite question qui n'a cependant rien à voir avec le sujet initial : Existe-t-il une fonction permettant d'effectuer une rotation sur un vecteur ?  
(Je voudrai pouvoir faire une rotation de la caméra, via la fonction glUlookat(). Et à part en utilisant une matrice de rotation et l'appliquer sur le vecteur définit par "visée-position", je n'ai pas trouvé de technique particulière.
La fonction glRotated() ne donne pas le résultat souhaité si je l'utilise sur glulookat() (si je push une matrice et que je fais les transformations, et que je mets glulookat() dedans, je me retrouve systématiquement en (0,0) lors de l'affichage. Et si j'applique la transformation sans passer par un pushmatrix, certains objets (alors qu'ils sont créés dans une matrice temporaire) sont transformés aussi)
 
Merci


---------------
Guybrush  
Reply

Marsh Posté le 03-02-2004 à 18:48:15    

glulookat definis un point de visé et non un vecteur, j'ai fait une classe permettant de gere la camera avec gklulookat avec comme mouvement possible ceux d'un quake like, donc je peut t'aider mais j'ai pas trop ciompris quel mouvement tu voulai faire(dis moi a quoi ca correspond dans un quake like) car utiliser glulookat est bien plus pratique que les transformation de la matrice de visualisation

Reply

Marsh Posté le 03-02-2004 à 18:48:15   

Reply

Marsh Posté le 03-02-2004 à 19:41:40    

J'ai écris une fonction permettant d'effectuer une translation de la caméra (je modifie donc les paramètres de glulookat). Cette translation correspond aux pas latéraux, ainsi qu'a "avancer" et "reculer" dans un fps.
 
Je souhaiterai faire une fonction qui permet de modifier le point de visée en fonction de la souris (comme dans un fps donc).
 
Mathématiquement parlant, je sais définir l'angle, ajouter une valeur à l'angle et déterminer un nouveau vecteur, mais il doit y avoir une erreur quelque part, puisque ma "rotation" de vecteur de visée (le vecteur définit par la position courante et le point visé) n'est pas correct.
 
Je précise également que je ne mets pas le vecteur directement dans glUlookat, mais je mets la position de la caméra et la position du point visé (qui est la somme de la position de la caméra + le vecteur de visée).  
 
Je suis interéssé par ta classe, en espérant qu'elle soit commentée, afin de voir comment tu effectues les rotations dues au mouvement de la souris (dans un fps).
 
merci


---------------
Guybrush  
Reply

Marsh Posté le 03-02-2004 à 20:41:13    

je t'ai envoyer un message privé ;)


Message édité par skelter le 03-02-2004 à 20:41:41
Reply

Marsh Posté le 03-02-2004 à 22:44:09    

Merci.  
 
Je n'ai malheureusement pas su trouver réponse à ma question, étant donné que ta solution fonctionne dans un plan uniquement horizontal, et que je dois l'appliquer à un système en 3 dimensions (bien qu'on puisse simplifier le système en 2 plans à 2 dimensions linéairement indépendant)


---------------
Guybrush  
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed