Bonjour,
Je travaille encore et toujours sur mon moteur 3D (dont j'ai repris la conception de noooombreuses fois) et apres y avoir "Enfin" ajouté des structures de partitionnement tels que Octree et Quadtree, des gestionnaires de ressources dignes de ce nom ou presque, des loader basiques de modeles 3D avec couleur et une couche de texture (gestion du multitexture pour une même mesh attention ça rigole plus :p) je voudrais pouvoir passer un peu au niveau supérieur et j'ai donc le choix entre beaucoup de points (Lumieres, Collisions, Animation, Texturage...etc...)
J'ai donc en ce moment l'envi de m'attaquer à tout ce qui touche au texturing et plus généralement aux matériaux j'ai donc imaginé un systeme de matériau basé sur un pattern type décorateur avec comme racine une classe contenant l'index buffer et ensuite tout un tas de décorateurs, couleur, diffuse, speculaire, alpha, bump.... sachant que sur cette jolie liste seul le décorateur couleur/texture est implémenté pour le moment :p
pour donner une idée de l'implémentation qui est des plus simple pour la classe couleur/texture cela donne par exemple :
Voila donc maintenant ma question (oui enfin XD)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 void ColorMaterial::apply() { glColor3ub( _color.r(), _color.g(), _color.b() ); if( _texture ) { glEnable(GL_TEXTURE_2D); glEnableClientState(GL_TEXTURE_COORD_ARRAY); // ou kelkchoz kom ca :p _texture->bind(); _uvs.bindUV(); } if( _next ) _next->apply(); if( _texture ) { glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); } } // et pour le code de la racine void RacineMaterial::apply() { _index.draw(); }
J'ai commencé à créer ma classe AlphaMaterial qui va contenir une texture d'alpha mais je pense qu'à partir de la il faudra donc passer en multitexturing ?
Parceque pour le moment mon décorateur alpha ne ressemble qu'à ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void AlphaMaterial::apply() { glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, _minval); //// ici il faudra initialiser la texture d'alpha if( _next ) _next->apply(); //// ici il faudra terminer la texture d'alpha glDisable(GL_ALPHA_TEST); }
voila j'espere que mon probleme est sufisemment bien exposé et que vous pourrez me donner des pistes de travail sachant que par exemple j'aimerais que si j'ai une texture d'alpha elle puisse être codé sur 8bit.. pour éviter les gaspillages.
Merci d'avance
Cordialement,
Seb
Partager