
Envoyé par
victor_gasgas
La bibliothèque va être un moteur de rendus multi-api (typiquement opengl et directx, mais pourquoi pas opengl es, software, etc).
Moteur de rendus (ie qui fournit des services telle "dessiner un cube", "dessiner un mesh", "appliquer une texture") ou une abstraction commune pour les api 3d (id fournit les services "créer un programme", "créer un shader", "transférer un buffer sur le gpu") ?
D'après ce que je vois ensuite, ça m'a l'air d'être la seconde possibilité (je reviendrais ensuite sur le pourquoi la distinction me semble importante)

Envoyé par
victor_gasgas
En effet, le traitement différé (dans un renderer) est obligatoire pour des raisons liés aux APIs.
Détails d'implémentation internes, qui ne doivent pas entrer dans l'api de ton moteur.
En règle générale, j'ai l'impression que tu ne ne fais pas la différence dans ton design ce qui fait partie de l'api (ie les services rendus) et les détails internes

Envoyé par
victor_gasgas
Cette fois-ci le problème c'est que certaines classes dépendaient de l'api alors que ça ne devait pas être le cas : imaginons une classe material constitué de shaders. Comment je déclare les shaders dans ma classe material, sans faire renderer<ogl>::shader_type?
Et cela pose problème car cette classe doit être indépendante de l'api.
Tu peux tout à fait avoir un concept material indépendant de l'api 3D et avoir un concept apply_material qui en dépend

Envoyé par
Flob90
Je ne comprends pas trop ton problème avec les templates, si ta classe material est constitué de shader et que les shader dépendent de l'api, alors la classe material en dépend aussi. Comment pourrait-il en être autrement ?
En général, un material, c'est juste un ensemble d'informations (quel texture de couleur de couleur, de texture d'AO, la normal map, etc), donc indépendant du code des shaders (ou presque)

Envoyé par
Flob90
Je n'y connais rien en API graphique, mais ça aurait un sens d'écrire quelque chose comme ?
1 2
| renderer << material1 << material2 << other;
//Ou un autre opérateur binaire |
Dans ce cas ta classe material n'a pas besoin d'être template, et tu pourrais définir des fonctions template libres amies de material qui fait ce qu'il faut.
Si ça se fait. Je crois que l'on a ça dans Qt3D
Mais sourtout, OpenGL ne peut avoir d'activer qu'une seule et unique instance pour chacun de ces types! Donc un seul program, une seule texture, etc sont active à un instant t.
C'est un détail d'implémentation interne. D'ailleurs, ce n'est pas obligatoire, tu peux travailler sans (direct mode), ou utiliser l'une des nombreuses possibilités (list, VAO, VBO, etc). Pour aller plus loin, je dirais que si tu veux un système évolutif, tu ne peux pas te baser sur un modèle en particulier, sinon tu risques de devoir changer lorsqu'il y a aura des évolutions (un nouveau type de BO par exemple)

Envoyé par
victor_gasgas
Cela veut donc dire que dans mes classes (material par exemple) je dois inclure chacune des spécialisations des renderers?
vaut mieux pas, sinon, tes material sont dépendant de l'api
Pour revenir sur le premier point.
Tu sembles vouloir faire une api qui permet de faire une abstraction des api 3D. Par exemple, si tu veut créer une shader en gl ou en d3d, tu devrais appeler les fonctions suivantes : CreateVertexShader ou glCreateShader. Pour ça, rien de compliqué, tu fais une simple fonction createShader qui appelle la fonction correcte selon l'api utilisée.
Le but est donc d'avoir du code indépendant de l'api 3d, mais d'appeler quand même des fonctions bas niveau (createShader, runKernel, etc)
Le problème est que tu devras écrire des shaders qui dépendront de l'api. C'est à dire que même si tu as une fonction createShader indépendante de l'api 3D, tu devras quand même faire du code (avec un #ifdef par exemple) qui dépendant de l'api 3D.
Donc en gros, tu n'as fait aucune abstraction et l'intérêt d'une telle api est très limitée 
Ce qui est intéressant, c'est de faire une abstraction qui te permet de manipuler des concepts 3D ("dessiner un cube", "dessiner un mesh", "appliquer une texture") indépendant de l'api 3D. Donc sans donner un code de shader spécifique à l'api 3D
Partager