Salut!
J'ai enfin trouvé une solution pour utilisé le batching tout en appliquant un OIT sans devoir passer par imageLoadStore!!!
La solution consiste à effectuer une première passe qui va écrire, dans chaque canal de couleur du FBO, les couleurs des fragments des différentes couche.
Le n° du canal correspondra alors à la position en z du fragment.
Le problème c'est que il peut y avoir autant de couches qu'il n'y a de valeurs possible pour z (prenons par exemple ici 1000 couches possibles), hors que le nombre de canaux pour le framebuffer d'une FBO est limité.
Donc, je ne peux pas faire ceci :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gl_FragData[z] = color;
Dans les jeux en général, il n'y a jamais plus d'une dizaine de fragments qui sont dessinées au même endroit, donc, 16 couches devraient suffire!
Par contre je ne vois pas comment passer de par exemple 1000 couches à 20 couches.
Je me suis alors dis que ça ne sert à rien d'utiliser des couches "vide" pour effectuer l'alpha blending surtout si dans les 1000 couches seulement quelques une sont remplie.
Comme je ne peux pas lire et écrire dans le FBO avec un seul draw, je ne peux pas savoir si la couche est vide ou pas et donc si je dois passer à la couche suivante.
Ce que je voudrais faire c'est quelque chose comme ceci :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Si il y a déjà quelque chose d'écrit on passe à la couche suivante! unsigned int pos = 0; for (unsigned int i = 0; i < MAX_COLOR_CHANNELS; i++) { if (texture(depthTextures[i], resolution.xy / gl_FragCoord.xy).z < z) { pos++; } }
Mais je ne vois pas comment faire cela.
Merci d'avance pour votre aide.
Partager