OpenGL : opaque derriere multi blending...ca part en sucette

OpenGL : opaque derriere multi blending...ca part en sucette - C++ - Programmation

Marsh Posté le 19-10-2004 à 14:56:47    

Bonjour,
 
J'ai un probleme lorsque j'affiche un objet opaque derriere une surface transparente...la surface opaque n'est pa modifié (comme au premier plan )
Le probleme ne vient pas du depth test (c sur) pour preciser mais plutot des mode de blending.
Je dois preciser que mes objet sont texturé en bmp donc sans couche alpha...
 
En gros Suis je obligé de passer en TGA ou PNG pour ces objets??
ou y a t il une autre methode??
merci d'avance :jap:  

Reply

Marsh Posté le 19-10-2004 à 14:56:47   

Reply

Marsh Posté le 19-10-2004 à 15:01:52    

tu peux rajouter  toi meme la couche alpha en passant ton tableau de données de rgb à rgba et en chargeant en GL_RGBA
 
mais montre plutot le code de la partie rendu, j'ai pas trop compris ton probleme (meme un petit screen si possible)

Reply

Marsh Posté le 19-10-2004 à 15:09:23    

oué moi non plus j'ai pas bien compris (tu sais qu'il faut afficher tes surfaces transparentes a la fin, apres les opaques ?)


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 19-10-2004 à 15:58:47    

oui...
J'ai essaye avec des TGA c est pareil...ca merde
En fait tout se passe bien quand les transparents sont au devant de la scene, tout va bien quand aucun ne se chevauchent
mais quand l'opaque passe devant...il n'est plus opaque!!!
 
et j'ai plus d'idee

Reply

Marsh Posté le 19-10-2004 à 16:05:23    

montre le code, ca simplifira les choses :)

Reply

Marsh Posté le 19-10-2004 à 16:12:13    

 
 
 
Voila le rendu de test :

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
 
 glLoadIdentity();
 glBindTexture(GL_TEXTURE_2D, textures[0].texID);
 
glTranslatef(0.0f,0.0f,-9);
 
//objets opaques
 
 glPushMatrix();
 glEnable(GL_DEPTH_TEST);
 glDisable(GL_BLEND);
 glRotatef(yrot,0.0f,1.0f,0.0f);
 glTranslatef(0.0f,0.0f,-5);
 box();
 glEnable(GL_BLEND);
 glDisable(GL_DEPTH_TEST);
 glPopMatrix();
 
//au cas ou on enleve le blending  
 if(!blend){
glDisable(GL_BLEND);//s il est remi a un moment
glEnable(GL_DEPTH_TEST);
 }
 
 //objets transparents
 glPushMatrix();
 glRotatef(xrot,1.0f,0.0f,0.0f);
 glRotatef(yrot,0.0f,1.0f,0.0f);
 box();
 glPopMatrix();
 
 
 glPushMatrix();
 
 glRotatef(yrot,0.0f,1.0f,0.0f);
 glTranslatef(0.0f,0.0f,+5);  
 box();
 
 glPopMatrix();

 
 
Et comment on fait pour les screen shots, la syntaxe demande un lien web???
j'essaie avec mon chemin:
on verra bien
[img]D:\marc\tutorials\lesson08\Lesson08\Data\shot.jpg[/img]
[img]D:\marc\tutorials\lesson08\Lesson08\Data\shot2.jpg[/img]
 

Reply

Marsh Posté le 19-10-2004 à 16:12:51    

pkoi diable tu vire le depth test ?


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 19-10-2004 à 16:13:03    

oups ca n'a pas marche... :cry:  
 :na:

Reply

Marsh Posté le 19-10-2004 à 16:14:29    

Il faut toujours dessiner les surfaces avec alpha après les surfaces sans

Reply

Marsh Posté le 19-10-2004 à 16:14:35    

(upload tes images sur imageshack)


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 19-10-2004 à 16:14:35   

Reply

Marsh Posté le 19-10-2004 à 16:15:04    

Kristoph a écrit :

Il faut toujours dessiner les surfaces avec alpha après les surfaces sans


 
(en les triant de back to front)


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 19-10-2004 à 16:17:14    

chrisbk a écrit :

(en les triant de back to front)


Un problème à la fois stp. On va voir déjà s'il comprend le premier ;)

Reply

Marsh Posté le 19-10-2004 à 16:19:19    

ben c est bien ce que je fais...opaque puis transparent
 
et si je vire pas le depth test avant le blending ca fait n'importe koi...

Reply

Marsh Posté le 19-10-2004 à 16:28:57    

active le depth test à l'init et n'y touche plus

Reply

Marsh Posté le 19-10-2004 à 19:56:05    

bon en clair:
 
- depth test enable (read+write)
- opaque geometry, front to back (grossièrement au départ, faudra rafiner si tu découvres qu'un tri plus fin améliore tes performances).
- depth test enable (pour pas que la géométrie transparente s'affiche derriere les objets opaques !)
- la tu as deux solutions. Premiere (couteuse et parfois impossible en pratique) : tu tries tes polygones transparents en back to front. Par polygone !, pour éviter les problèmes d'occlusions mais ça garantit que l'affichage sera correct. Deuxieme solution: tu traces dans un grossier ordre back to front (par objet) en désactivant le depth write (ça introduit quelques artefacts si ta transparence est complexe).  
 
Tu as la derniere solution qui consiste à n'afficher des faces transparentes qu'en mode additif ce qui permet de ne pas trier mais nécessite toujours la désactivation du DEPTH WRITE (et pas du depth test, je ne sais pas si tu vois la distinction).
 
L'utilisation du mode additif c'est en dernier recours parce que ça ne marche que pour certains effets..


Message édité par LeGreg le 19-10-2004 à 20:00:46
Reply

Marsh Posté le 19-10-2004 à 19:58:34    

Il y a quelques applications pro qui utilisent l'order independent transparency:
http://developer.nvidia.com/object [...] rency.html
 
En general c'est overkill pour les jeux.

Reply

Sujets relatifs:

Leave a Replay

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