On va laisser son job à Wazp3D: Un rendu software. C'est vrai que l'idée est séduisante, mais quitte à avoir les sources de MiniGL, autant plancher là dessus.
Bon, on va planter le décord: Je n'ai jamais fait d'OpenGL. J'ai un moteur 3D utilisant directement Warp3D, il fonctionne très bien, mais à ma manière. Je ne connais pas le fonctionnement d'un moteur utilisant des fonctions OpenGL, donc, je ne sais pas lesquelles sont appellées, ni dans quel ordre. A quel moment sont fait les transformations, à quel moment est fait le rendu, est ce que le clipping est fait avant/après transformation, tout ça, je ne sais pas.
Je ne réécrirais pas tout MiniGL, c'est trop de boulot, je n'en ai ni le temps, ni le courage. Par contre, il est possible de réécrire des fonctions entières lorsqu'elles ont l'air critique et qu'elles sont assez peu dépendantes du reste.
J'ai trouvé une "entrée" qui me semble interressante: glDrawElementTriangles (glDrawElements). C'est une fonction par laquelle A PRIORI toutes les routines de triangles semble passer. En tout cas, lorsque je supprime les fonctions de traçage de cette fonction, Quake3 et Hurrican n'ont plus d'affichage, donc ça passe par là.
Dans cette fonction, il y a du clipping. A priori il ne semble pas avoir été fait avant, il est fait au moment du rendu. Je sais pas si c'est tout OpenGL qui est comme ça où si c'est spécifique MiniGL, mais en fait ça m'arrange.
Plus étrange cependant, il y a un appel à une fonction succeptible des faires de transformations 3D, et ça, je ne pige absolument pas pourquoi.
glDrawElement() est une fonction appelée directement par le programme: Son nombre d'appel dépend directement de l'optimisation du moteur. Sur un lieu au hazard, ioQuake3 faisait appel une centaine de fois à cette fonction par frame. C'est bien peu comparé au nombre d'appel Warp3D que la fonction elle même fait abusivement.
Comme je le disais plus haut, cette fonction fait le clipping des triangles. Actuellement, pour ce faire, elle fait appel à une sous fonction qui clip UN triangle puis l'affiche immédiatement. En buffirisant les triangles clippés, il y a là encore un gain colossale
Donc, dans l'asbolu, en réécrivant cette fonction pour qu'elle trace tout d'un unique DrawArray (triangle non clippé et clippé), il y a une base d'optimisation énorme rien que sur elle.
Avis des connaisseurs là dessus? Alain?
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet