私が思いつくことができる最高の解決策は、深度計算には円柱状のビボーディングを使用し、クワッドの実際の位置には球形を使用することでした。これにより、クワッドの深さを一定に保ちながら、球形のビボーディングを使用することができます。
ここでは、BillboardのModelView Matrixが参照されています。 [x]:値がそのまま残っていることを示します。
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]
まず円筒形ビルボーディングためModelViewMatrixを変更しような深さの頂点を生成する:
depthV = projectionMatrix * (mvm * vertex);
次に球状ビルボーディングのための第2の列の値を設定し、通常通りクワッドを作成する:
mvm[1][0] = 0; mvm[1][2] = 0; mvm[1][1] = 1;
gl_Position = projectionMatrix * (mvm * vertex);
最後に、深さVをフラグメントシェーダに送り、深度計算に使用します。
float ndcDepth = depthV.z/depthV.w;
gl_FragDepth = ((gl_DepthRange.diff * ndcDepth) + gl_DepthRange.near + gl_DepthRange.far)/2.0;
スケーリングは、ModelViewマトリックスを適用する前に行う必要があります。