CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] [OGL] Blending

techslash
techslash
Niveau 8
25 décembre 2004 à 10:36:41

Salut à tous,

Les vacances de Noël sont arrivées et je suis évidemment de retour :) !

J´ai recommencé à jouer dans mon petit framework. Grâce au gourou Nehe, c´est plutôt simple d´apprendre à connaitre de nouvelles fonctions.

Cela dit, j´ai frappé un mur avec le blending. En bref, le site de Nehe dit que...

Pour blender correctement, il faut trier, afin d´en faire le rendu, les polygones du plus loin au plus proche ( donc de celui dont la valeur en z est la plus petite jusqu´à celui qui a la plus grande) sans désactiver le GL_DEPTH_TEST qui, si je comprends bien, fait généralement en sorte de couper le rendu des polygones qui sont masqués par d´autres.

Or, le projet exemple de Nehe n´offre qu´un cube qui tourne avec le GL_DEPTH_TEST désactivé.

Afin de comprendre la logique d´un blending fait " correctement", j´ai voulu faire un tri du plus profond au plus proche sur ma caisse qui tourne sur elle-même.

Ça fonctionne ! Mais seulement au tout début, soit pour le court instant où mon tri est vrai ( c´est à dire que, en faisant une rotation sur elle-même, les polys changent inévitablement de position et celui le plus proche de l´utilisateur devient lentement celui qui est le plus loin).

J´aimerais savoir comment solutionner ce problème. Je vois mal comment faire du sorting sur les faces du cube sachant qu´ils subissent une rotation par une matrice glRotatef().

Merci bien !
Joyeux Noël !

LGV
LGV
Niveau 28
25 décembre 2004 à 12:06:39

il est en effet important de trier les polygones transparents pour obtenir le rendu souhaite.
Pour ce qui est du z-buffer, actif ou pas, deux philosophie : desactiver l´ecriture quand on dessine des polys transparents ( marche bien si on les dessine en dernier, apres tout ce qui est " solide"), desactiver le test, comme tu as du le voir dans l´exemple.
Pour le tri, par de miracle : si tu utilises une simple rotation locale pour tout ton modele, il va falloir revoir et complexifier legerement la chose. Tu peux par ex. pour chaque poly transparent retenir son barycentre et calculer les positions relatives a la camera de ces derniers uniquement pour trier tes faces.

JeanYvesYves
JeanYvesYves
Niveau 10
25 décembre 2004 à 13:15:38

Avant de t´exposer la solution, un petit cours de maths :

tu as un point x,y,z.
tu as une caméra a une position < plouf>
ce que tu veux, toi, c´est la position

x2,y2,z2, dans le repere de la caméra : ou x2,y2 seront la coordonnée dand le frustrum, et z2 la position relative de ton polygone
c´est sur z2 qu´intervient le z-buffer, autrement dit, si tu as z2, tu peux faire ton tri.
( apres, openGL calcule x3,y3, ( z3) pour obtenir la position x3,y3 qui sera sur ton écran)

Donc toi, tu veux x2,y2,z2 :

c´est tres simple :

( x2,y2,z2) = Matrix_View * ( x,y,z)

et ta matrix_view est a jour juste apres que tu appelles ton glRotate ( qui ne fait que mettre a jour ta matrix_view)

Techniquement : juste apres ton glRotate, tu fais :

glMatrixMode(GL_MODELVIEW);
ensuite, soit tu calcules a la main en récupérant la matrice ( avec glGet() )
soit tu triches et tu utilises :
glMultMatrix
en chargeant des valeurs bidons dans les autres colonnes que la premiere.

:)

JeanYvesYves
JeanYvesYves
Niveau 10
25 décembre 2004 à 13:17:14

oups, en me relisant, je me dis qu´il faudra peut etre traiter sur z3 et non z2.

car x2,y2,z2 te donnent tes points dans un repere absolu 0,0,0

il faut que tu rajoutes :

( x3,y3,z3) = Matrix_projection * ( x2,y2,z2)

techslash
techslash
Niveau 8
25 décembre 2004 à 19:18:29

Je vois ! Whew, en conclusion c´est pas mal de travail en perspective :).

Merci beaucoup et un dernier joyeux Noël :) .

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment