广告牌精灵与 3D 对象相交

Billboarded sprites intersecting 3D objects

我正在使用球形广告牌精灵和 3D 对象。由于四边形向后倾斜以匹配摄像机角度,因此它与紧靠其后方的 3D 对象相交。当摄像机角度非常 large.The 之后 link 提供非常清晰的视觉效果时,这一点更为明显。 http://answers.unity3d.com/questions/582680/billboard-issue-in-front-of-3d-object.html

有没有有效的方法来解决这个问题?

我能想到的最佳解决方案是使用圆柱形广告牌进行深度计算,使用球形广告牌作为四边形的实际位置。这允许您使用球形广告牌,同时确保四边形的深度保持不变。

此处供参考的是广告牌模型视图矩阵。 [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);

接下来设置球形广告牌的第二列值并像往常一样创建四边形:

mvm[1][0] = 0; mvm[1][2] = 0; mvm[1][1] = 1;
gl_Position = projectionMatrix * (mvm * vertex);

最后将depthV发送给片元着色器,用于深度计算。

float ndcDepth = depthV.z / depthV.w;
gl_FragDepth = ((gl_DepthRange.diff * ndcDepth ) + gl_DepthRange.near + gl_DepthRange.far) / 2.0;

缩放应在应用 ModelView 矩阵之前完成。