La meilleure solution que je pouvais trouver était d'utiliser l'affichage cylindrique pour les calculs de profondeur et sphérique pour la position réelle du quad. Cela vous permet d'utiliser un panneau d'affichage sphérique tout en vous assurant que la profondeur du quad reste constante.
Pour référence, voici les matrices ModelView d'affichage. [x]: implique que la valeur est laissée telle quelle.
Cylindrical mvMatrix Spherical mvMatrix
[1][x][0][x] [1][0][0][x]
[0][x][0][x] [0][1][0][x]
[0][x][1][x] [0][0][1][x]
[x][x][x][x] [x][x][x][x]
d'abord modifier la ModelViewMatrix pour billboarding cylindrique et générer un sommet de la profondeur en tant que tel:
depthV = projectionMatrix * (mvm * vertex);
Suivant définir les deuxièmes valeurs de colonne pour billboarding sphérique et créer le quad comme d'habitude:
mvm[1][0] = 0; mvm[1][2] = 0; mvm[1][1] = 1;
gl_Position = projectionMatrix * (mvm * vertex);
Enfin, envoyez depthV au fragment shader et utilisez-le pour le calcul de profondeur.
float ndcDepth = depthV.z/depthV.w;
gl_FragDepth = ((gl_DepthRange.diff * ndcDepth) + gl_DepthRange.near + gl_DepthRange.far)/2.0;
La mise à l'échelle doit être effectuée avant d'appliquer les matrices ModelView.