[OpenGL] Pb avec intersections

Pb avec intersections [OpenGL] - Programmation

Marsh Posté le 18-03-2002 à 12:45:47    

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 ???

Reply

Marsh Posté le 18-03-2002 à 12:45:47   

Reply

Marsh Posté le 18-03-2002 à 12:56:20    

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

Reply

Marsh Posté le 18-03-2002 à 13:01:01    

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.

Reply

Marsh Posté le 18-03-2002 à 13:03:12    

Merci !

Reply

Marsh Posté le 18-03-2002 à 17:50:27    

comment ça s'utilise glDepthRange ?
j'ai essayé de changer les valeurs mais je n'obtiens rien de bien mieux ;(

Reply

Marsh Posté le 18-03-2002 à 17:51:35    

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 ?

Reply

Marsh Posté le 18-03-2002 à 18:18:31    

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 ;)

Reply

Marsh Posté le 18-03-2002 à 22:09:03    

mon terrain est centré sur 0, et il fait 256 de large au total (de -128 à +128).

Reply

Marsh Posté le 18-03-2002 à 22:46:14    

youdontcare a écrit a écrit :

tu donnes quoi comme valeurs ?


Reply

Marsh Posté le 19-03-2002 à 08:28:53    

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 :)

Reply

Marsh Posté le 19-03-2002 à 08:28:53   

Reply

Marsh Posté le 19-03-2002 à 10:54:25    

arf c'est trop laid !

Reply

Marsh Posté le 19-03-2002 à 11:09:08    

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/ ?

Reply

Marsh Posté le 19-03-2002 à 11:15:35    

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

Reply

Marsh Posté le 19-03-2002 à 11:37:05    

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 !!

Reply

Marsh Posté le 19-03-2002 à 14:02:51    

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

Reply

Sujets relatifs:

Leave a Replay

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