|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() ![]() Alexandre LaurentÉtudiant Inscription : mai 2008 Messages : 6 560 ![]() |
Bonjour,
Je suis sur un nouveau programme OpenGL. À la base, tout objets OpenGL est identifiable avec un GLuint. Pour chaque type d'objet OpenGL, nous avons une fonction associée, créant l'objet du coté de la bibliothèque et nous retournant l'identifiant. Je cherche en quelque sorte à encapsuler ce design. Au début, je pensais faire un objet GLObject parent de tous, de la façon suivante : Code c :
Mais, le compilateur a voulu s'en mêler et m'a signalé que je faisais surement un truc de mal avec mes appels à des fonctions pure dans le constructeur / destructeur. Du coup, j'imagine que j'ai un problème de design. Pourquoi ne pas vouloir faire l'appel des fonctions OpenGL dans les constructeurs / destructeurs, à vrai dire je ne suis pas trop sur. Principalement, car je souhaitais avoir une fonction séparée pour la gestion de OpenGL (séparée de la construction de l'objet). Enfin bref, cela est surement idiot, surtout que je l'appel dans le constructeur afin d'être bien sur qu'elle soit appelée. Par contre, je me demande comment vous feriez ? L'avantage d'avoir une classe GLObject, c'est que je pourrai avoir une banque d'objet qui pourrait même indiquer l'utilisation faite des objects OpenGL et permettre leurs destruction automatiquement.
__________________
Vous souhaitez participer à la section Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
||
|
|
11
|
|
|
#2 |
|
Membre éclairé
![]() Jun MaillardLycéen Inscription : juin 2009 Messages : 221 ![]() |
Bonsoir,
Personnellement j'ai du mal a voir l’intérêt de tels fonctions... Après tout la classe Texture possède elle aussi un constructeur et un destructeur : pourquoi ne pas appeler les fonctions OpenGl dedans ? Et puis ça me parait bizarre que la classe de base s'occupe de dire aux classes filles qu'elle doivent s'initialiser alors que sa propre initialisation n'est pas terminée (puisqu'on est pas sorti de son constructeur) |
|
|
00
|
|
|
#3 |
![]() ![]() |
Salut,
Il ne faut pas oublier que, dans le constructeur et dans le destructeur, on ne connait que le type de l'objet que l'on est occupé à (créer ou à détruire , évidemment) et de ses parents... ou, plutot, dans l'autre sens : on ne connait rien, dans le constructeur ou dans le destructeur d'une classe, des classes qui peuvent éventuellement dériver de celle sur laquelle on travaille Cela implique que, si tu fais appel à une fonction virtuelle dans le constructeur (ou dans le destructeur) de la classe de base, c'est la version de la classe de base de la fonction qui sera appelée, et non une quelconque redéfinition de celle-ci Or, si ta fonction est virtuelle, c'est parce que tu t'attends à ce qu'elle réagisse correctement pour le type dérivé dans lequel elle est redéfinie Le compilateur a donc deux fois raison de refuser de tels appels :
__________________
en bas de page |
|
|
20
|
|
|
#4 |
|
Membre habitué
![]() Inscription : juin 2009 Messages : 81 ![]() |
Salut LittleWhite!
Ca fait longtemps que je ne suis pas venu sur le t'chat ![]() J'ai lu en diagonale mais comme l'a dit Koala, n'appelle jamais de fonctions virtuelles dans les constructeurs et destructeurs. Maintenant, je ne suis pas sûr d'avoir saisi ce que tu veux réellement faire mais un design pattern pourrait peut-être t'aider, Abstract Factory / Factory Methods. Si tu peux développer, en donnant une hiérarchie de classes et l'utilisation que tu en ferais, cela sera plus aisé de t'apporter une réponse appropriée. |
|
|
00
|
|
|
#5 |
![]() ![]() ![]() Alexandre LaurentÉtudiant Inscription : mai 2008 Messages : 6 560 ![]() |
Il est plus qu'évident que mon design était pourri
et irréfléchi.Pour la Factory, je pense que cela sera pratique surtout si je veux faire un suivi des objets crée. Du coup, je vais partir sur un objet GLObject qui ne contiendra qu'un GLint et qui sera hérité. Merci pour vos réponses
__________________
Vous souhaitez participer à la section Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
|
01
|
|
|
#6 | |
![]() ![]() |
Citation:
Je ne dis pas que ce n'est pas la solution, mais, ma grosse crainte, c'est que tu finisse, à cause de ce "god object", par faire cohabiter des poires avec des voitures au seul prétexte qu'elles ont toutes les deux un numéro et une couleur ![]() si tu crées ton "GlObject", quelle en sera la responsabilité Cette responsabilité sera-t-elle compatible avec les responsabilité des classes qui en héritent Ne peut on pas envisager de dire que le fait de fournir un moyen permettant d'obtenir un identifiant (unique) telle qu'une fonction id() n'est qu'un prérequis d'interface commun à tout objet qui sera manipulé, sans pour autant que cela ne nécessite une hiérarchie unique et monolithique Mieux encore, ne peut on pas envisager le fait que tout ce qui a traiit à OpenGL n'a strictement rien à voir avec la hiérarchie d'objet que tu t'apprêtes à créer, dans le sens où tes objets n'ont, a priori, aucune raison d'avoir la responsabilité de leur affichage Je n'ai pas de réponse toute faite à ces questions (ce qui ne m'empêche pas d'avoir mon avis ![]() Peut etre serait-il utile que tu réfléchisse à la réponse à donner à chacune de ces questions, ne serait-ce que pour t'assurer que tu auras pris la bonne décision en pleine connaissance de cause
__________________
en bas de page |
|
|
|
10
|
|
|
#7 |
![]() ![]() ![]() Alexandre LaurentÉtudiant Inscription : mai 2008 Messages : 6 560 ![]() |
La responsabilité de mon object ? Je suis à la limite de répondre : "Aucune"
Le GLObject ne contient qu'un ID et rien d'autre. Il y a un getter et c'est tout. Au final, peut être que je n'ai absolument pas besoin de faire un tel objet. Toutes classes qui héritera de cet objet, aura besoin de l'ID. Par contre, un héritage me donne l'impression que ce n'est pas le bon choix, et que je devrais juste avoir un membre GLObject dans ces classes. Pour l'instant, l'affichage est géré par un Renderer externe, qui utilisera les fonctions des classes héritants de GLObject. SInon, je viens de penser, que je pourrais peut être rajouter des fonctions bind() / unbind() virtuelle pure .
__________________
Vous souhaitez participer à la section Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
|
00
|
|
|
#8 | |||||
![]() ![]() |
Citation:
![]() L'un dans l'autre, je ne suis pas loin de penser que, si une classe n'a pas une responsabilité clairement définie, elle risque, à terme, de se retrouver avec tout plein de responsabilités, non Citation:
Citation:
Comme je te l'ai dit, je ne doute pas que l'interface proposée par cette classe soit un prérequis pour tout objet que tu manipulera, mais, dans quelle mesure ne pourrais tu pas te tourner soit vers une composition classique, soit vers une solution à base de CRTP Citation:
Il peut sembler cohérent de créer une hiérarchie de classes dont la responsabilité sera d'afficher (au final sous OpenGL) tes objets "business", mais, a priori, tes objets business n'ont strictement rien à voir avec GLObject : leur responsabilité sera sans doute de tout et de n'importe quoi... sauf l'affichage Citation:
Je ne suis contre rien en particulier, j'essaye juste de t'inciter à réfléchir au besoin que tu essayes de rencontrer, et, surtout, d'arriver au besoin que cette hiérarchie de classes serait sensée couvrir
__________________
en bas de page |
|||||
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Inscription : septembre 2010 Messages : 1 350 ![]() |
Bonsoir.
D'abord, sur le GLObject... Certes, tous les objets OGL ont un ID. Est-il pour autant nécessaire de créer une classe qui ne contiendrait qu'un seul champ ? Voyons les reponsabilités possibles :
Si je puis me permettre une esquisse de hiérarchie objet... Au niveau intermédiaire tu as deux catégories d'objets essentiels qui doivent dialoguer l'un avec l'autre : les matériaux/shading (marbre, bois, etc : ils sont composés d'un ensemble de textures, d'options de rendu, peut-être de morceaux de shaders, etc) et les forme/shapes. Tous deux peuvent influencer le choix des shaders, textures, format des sommets, états à utiliser, groupes de rendu (objets statiques ou dynamiques, opaques ou transparents, etc), méthode de rendu (multipasse, etc). Appelons cet ensemble d'états un procédé de rendu / RenderProcess. De là tu dois donc mettre en place un dialogue entre le matériau et la forme pour qu'ils produisent conjointement une série de "primitives" de rendu contenant chacune un procédé de rendu et un maillage. Par exemple tu peux passer la forme en argument au matériau ou lui passer un ensemble d'infos nécessaires. Le matériau produit en retour des primitives, qui peuvent éventuellement être complétées par le matériau. Après, il ne reste plus "qu'à" passer tout ça dans un BSP, trier selon Z, batcher, etc. Quant à celui qui appellera les commande OGL, le procédé de rendu ou l'un de ses composants est tout indiqué, tout en s'appuyant sur des objets VBO, texture, et compagnie pour éviter les répétitions. A moins que tout ce beau monde ne s'appuie sur une abstraction "backend" qui pourrait être indifféremment implémentée via OGL ou D3D. |
|
|
10
|
|
|
#10 |
![]() ![]() ![]() Alexandre LaurentÉtudiant Inscription : mai 2008 Messages : 6 560 ![]() |
Le but final, si un jour je vais jusqu'à ce stage, c'est d'avoir assez d'abstractions pour changer entre OpenGL et D3D. Mais actuellement, mon histoire est que je dois surtout faire une implémentation OpenGL.
Je comprends votre point de vue. Je suis plutôt d'accord pour les matérials / shaders | mesh / texture. Mais, ma question est du coté de comment on implémenterai l'ID OpenGL pour la texture ... A priori, le principe simple de base d'avoir un l'ID directement dans la classe Texture ne vous gêne pas. Pourtant, si je veux avoir un gestionnaire d'objet pour faire des stats ou je ne sais quoi ... ils doivent tous hérité d'une classe Object (mais comme cet argument n'est qu'une hypothèse d'évolution, mieux vaut que je ne m'y attache pas).
__________________
Vous souhaitez participer à la section Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
|
00
|
|
|
#11 | ||
![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 2 888 ![]() |
J'avais pas lu cette discussion. On en avait discuter sur le chat.
Tu peux utiliser ici (encore) les classes de traits/politiques (désolé LittleWhite, comme c'est presque les bases de la programmation générique, je te les sors à toutes les sauces Sinon, sans template, tu peux aussi créer des fichiers spécifiques pour GL et D3D contenant les typedef et fonctions libres spécifiques (ou des classes utilitaires), qui seront inclus (ou non) à la compilation. Par exemple : Code :
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur la programmation des GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. |
||
|
00
|
|
|
#12 |
![]() ![]() ![]() Alexandre LaurentÉtudiant Inscription : mai 2008 Messages : 6 560 ![]() |
Merci gbdivers, mais là je doute qu'il faille un traits/politique. Du moins, je ne vois pas où (la question de pose aussi pour OpenAWars pour le moment).
Ah si, vous c'est parce que vous souhaitez faire un truc : Ce qui n'est pas mon problème actuel
__________________
Vous souhaitez participer à la section Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
|
00
|
|
|
#13 | |||||
![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 2 888 ![]() |
Citation:
Je donnais une solution pour : Citation:
Citation:
Code :
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur la programmation des GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. |
|||||
|
00
|
|
|
#14 | |||
![]() ![]() |
Citation:
![]() Il es possible de faire sensiblement la même chose avec DirectX qu'avec OpenGl, mais le moyen d'y arriver sera forcément différent ( ne serait-ce que par le nom de la fonction à appeler L'idée est donc de mettre en place ce qui pourrait ressembler à une "façade" fournissant une interface unique adaptée à tes besoins et appelant les fonctions adaptées à la bibliothèques utilisée de manière transparente pour l'utilisateur Tu as donc une première notion tout à fait transversale qui est le "contexte" d'utiliisation (DX ou Gl, selon le cas) qui pourrait très bien etre représenter par deux (ou plus, si tu décides un jour d'utiliser une autre bibliothèque Code :
Après cela, quelques ifdef et un -DOpenGl ou un -DDirectX peuvent parfaitement suffire pour te permette de passer aisément d'une compilation prévue pour OpenGl à une compilation prévue pour DirectX Mais cela montre bel et bien que la notion même d'une classe OglObject (ou quel que soit son nom) dont la responsabilité n'est pas clairement définie ne rime pas à grand chose Maintenant, si, dans ta façade, tu venais à créer une classe DrawableObject à spécialiser en fonction du contexte et fournissant des services cohérents, il en irait tout à fait autrement
__________________
en bas de page |
|||
|
|
20
|
|
|
#15 | |
![]() ![]() Inscription : juin 2008 Messages : 7 494 ![]() |
Salut,
Citation:
(P.S. : fonctions virtuelles dans les constructeurs) |
|
|
|
00
|
|
|
#16 | |
|
Expert Confirmé
![]() Inscription : septembre 2010 Messages : 1 350 ![]() |
Citation:
Typiquement, on pars d'un graphe de haut niveau (voiture, camion, bonhomme, etc) et on arrive à un graphe de bas niveau (maillages, états de rendu, etc). Entre les deux on peut avoir une foule de graphes intermédiaires. |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com