Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4309 connectés 

 


Dernière réponse
Sujet : [OpenGL] Pb avec intersections
LeGreg sincerement j'ai autre chose a faire qu'aller voir les exemples de Nehe qui sont souvent pas super bien codes ;).
Deja une valeur de 0 pour le Z-Near
est une erreur et sera reportee comme telle
par ton driver openGL. en gros pour un ZNear de 0,
toute ta geometrie serait applatie en une seule valeur du
zbuffer. certains drivers ont le comportement precite,
d'autres detectent l'erreur et considere que tu as fait
une NOOP.
 
ce qu'il faut que tu saches c'est que
ton z-buffer n'est pas lineaire en Z malgre ce que semble indiquer son nom.
le Z-buffer comme implante par la plupart des constructeurs
de carte video est concu pour une chose: offrir le plus
de precision pour la resolution du Z-Fighting à proximite de l'observateur. Ce qui est tout a fait logique: Un objet pres, devrait prendre plus de place sur l'ecran et les artefacts devraient etre plus visibles, donc on preserve la precision pour les objets les plus pres. Mais quand 90% des valeurs utilisees par ton z-Buffer se retrouvent dans 10% de ton espace et que tu n'as evidemment que 65536 valeurs possibles, tu te rends bien compte que ca laisse tres peu de precision possible pour
les objets situes dans les 90% de ton espace restant.
 
Tu as donc plusieurs solutions, que tu peux combiner:
- diminuer l'importance de l'espace proche, en eloignant le zNear tout en conservant ton zfar (qui doit etre le plus proche possible tout en evitant le clipping de tes polygones trop eloignes). Le mieux c'est d'experimenter jusqu'a ce que tu aies la precision desiree.
- Augmenter le nombre de valeurs que peut prendre ton z-buffer. Si en passant de 16bits (65536 valeurs) a 24 bits (16Millions de valeurs) voire 32bits (4 Milliards de valeurs) ne regle rien c'est que tu as fait une erreur ailleurs et que changer la resolution du zbuffer ne reglera rien.
- Utiliser le Zbuffer pour regler l'ordre relatif des objets et regler les cas d'intersections d'objets eloignes a la main. mais ca ne reglera pas tous les problemes de z-fighting.
- passer au W-Buffer si ton hardware le permet. La repartition des valeurs sera uniforme sur ton espace donc attention a la precision des intersections pour les objets les plus proches!
 
A+
LEGREG

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
LeGreg sincerement j'ai autre chose a faire qu'aller voir les exemples de Nehe qui sont souvent pas super bien codes ;).
Deja une valeur de 0 pour le Z-Near
est une erreur et sera reportee comme telle
par ton driver openGL. en gros pour un ZNear de 0,
toute ta geometrie serait applatie en une seule valeur du
zbuffer. certains drivers ont le comportement precite,
d'autres detectent l'erreur et considere que tu as fait
une NOOP.
 
ce qu'il faut que tu saches c'est que
ton z-buffer n'est pas lineaire en Z malgre ce que semble indiquer son nom.
le Z-buffer comme implante par la plupart des constructeurs
de carte video est concu pour une chose: offrir le plus
de precision pour la resolution du Z-Fighting à proximite de l'observateur. Ce qui est tout a fait logique: Un objet pres, devrait prendre plus de place sur l'ecran et les artefacts devraient etre plus visibles, donc on preserve la precision pour les objets les plus pres. Mais quand 90% des valeurs utilisees par ton z-Buffer se retrouvent dans 10% de ton espace et que tu n'as evidemment que 65536 valeurs possibles, tu te rends bien compte que ca laisse tres peu de precision possible pour
les objets situes dans les 90% de ton espace restant.
 
Tu as donc plusieurs solutions, que tu peux combiner:
- diminuer l'importance de l'espace proche, en eloignant le zNear tout en conservant ton zfar (qui doit etre le plus proche possible tout en evitant le clipping de tes polygones trop eloignes). Le mieux c'est d'experimenter jusqu'a ce que tu aies la precision desiree.
- Augmenter le nombre de valeurs que peut prendre ton z-buffer. Si en passant de 16bits (65536 valeurs) a 24 bits (16Millions de valeurs) voire 32bits (4 Milliards de valeurs) ne regle rien c'est que tu as fait une erreur ailleurs et que changer la resolution du zbuffer ne reglera rien.
- Utiliser le Zbuffer pour regler l'ordre relatif des objets et regler les cas d'intersections d'objets eloignes a la main. mais ca ne reglera pas tous les problemes de z-fighting.
- passer au W-Buffer si ton hardware le permet. La repartition des valeurs sera uniforme sur ton espace donc attention a la precision des intersections pour les objets les plus proches!
 
A+
LEGREG
Mikvix j'ai fait un bon tas de tutos sur Nehe, et j'ai jamais eu à m'occuper de ce probleme ...
 
en fait, si tu veux avoir une idée de ce qui me pose probleme, tu prends le tutorial 35 de Nehe (le terrain, justement :)) et tu traces un plan qui le coupe (symbolisant l'eau) ...
 
je pense que tu auras le meme probleme que ce que j'obtiens.
 
Je peux pas faire de screenshot, j'ai pas accés à mon programme ici ...  
 
pour décrire le probleme, je dirais que l'intersection entre l'eau et le terrain est ultra simplifiée ... au lieu de faire un truc bien net, ça fait des "escaliers" ... une sorte d'approximation de l'intersection ... et si je me souviens bien, en zoomant les intersections s'améliorent ... lorsque je fais des rotations autours du terrain, les intersections ne sont pas "stables" ... ça ne peux venir que du z-buffer je pense ...
 
dans mon programme, je trace le terrain, puis ensuite l'eau ... si je regle le z-near à plus de 0, l'eau recouvre toujours le terrain ... à 0 le terrain est visible mais les intersections approximatives.
 
Voilà :)
Merci beaucoup pour votre aide !!
LeGreg deja il faudrait qu'il nous explique pourquoi  
c'est laid.. t'as pas un screenshot a nous montrer?
ou une description un chouai plus precise?
 
LEGREG
youdontcare déjà il ne faut pas mettre 0 en znear mais au moins un entier strictement positif.
 
pour le reste, je suis à court d'idées - ça fait ça sur tous les programmes opengl ? ou juste sur le tien ? tu as essayé les exemples sur http://nehe.gamedev.net/ ?
Mikvix arf c'est trop laid !
Mikvix j'ai testé tout un tas de valeurs ...
j'ai mis dans les (0,3000) (0,100), (0.1,1) (1,1) (1,250) etc ...
enfin bref, j'ai testé plein de truc :)
youdontcare

youdontcare a écrit a écrit :

tu donnes quoi comme valeurs ?


Mikvix mon terrain est centré sur 0, et il fait 256 de large au total (de -128 à +128).
youdontcare tu donnes quoi comme valeurs ? il faut minimiser le ratio zfar / znear.  
 
ce sont les coordonnées z dans le repère caméra, si ton terrain fait 100 de long, tu peux essayer (5, 200) par ex.  
 
je dis ça au pif, essaye ;)
Mikvix comment ça s'utilise glDepthRange ?
j'ai essayé de changer les valeurs mais je n'obtiens rien de bien mieux ;(
comment je dois choisir mes valeurs ?
Mikvix comment ça s'utilise glDepthRange ?
j'ai essayé de changer les valeurs mais je n'obtiens rien de bien mieux ;(
Mikvix Merci !
youdontcare ou ton ratio zfar / znear est trop grand (en éxagérant 100000 / 0.00001f), ton terrain est contenu en z [100, 200], donc seulement un tout petit bout de l'ensemble de déf du zbuffer est alloué pour ton terrain.
chrisbk a priori, je te dirais Z-Fighting, autrement dit ton Z-buffer est pu assez precis et ca rend un truc ignoble
 
Solution : passer en Z-B 32bpp, et augmenter la tesselation
Mikvix Yop !
 
Dans mon app Opengl, je trace un terrain 3d obtenu à partir d'une image en niveau de gris ... j'ai donc un petit tas de triangles qui représente un terrain ... ça c'est bon ...
 
MAIS lorsque je veux tracer un simple plan (l'eau) , qui coupe ce terrain, les intersections sont trés laides ...
 
Y a pas quelqu'un qui saurait pourquoi ???

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)