与3D对象相交的Billboarded精灵

时间:2016-04-08 21:05:09

标签: opengl vertex-shader

我正在使用球形的广告牌精灵以及3D物体。因为四边形向后倾斜以匹配摄像机角度,所以它与紧跟在其后面的3D对象相交。当摄像机角度非常大时更加明显。以下链接提供了非常清晰的视觉效果。 http://answers.unity3d.com/questions/582680/billboard-issue-in-front-of-3d-object.html

有解决此问题的有效方法吗?

1 个答案:

答案 0 :(得分:0)

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

此处参考的是广告牌ModelView Matrixes。 [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 Matrix之前进行缩放。