我想在我的应用程序中显示一些雾/鸟瞰图。但是我只想使用相机到模型的x,y世界距离来确定外观。
通过这个calculation,我已经设法获得了相机到模型的Z轴距离。
红色物体与相机的z距离为正,蓝色物体与此implementation相比则为负,此时所有值似乎均为正。
顶点着色器:
uniform mat4 u_mvp; // Model-View-Projection-Matrix
uniform mat4 u_mv; // Model-View-Matrix
uniform vec4 u_color; // Object color
attribute vec4 a_pos; // Vertex position
varying vec4 color; // Out color
// Fog
const float density = 0.007;
const float gradient = 1.5;
void main() {
gl_Position = u_mvp * a_pos;
// Fog
float distance = -(u_mv * a_pos).z; // Direct distance from camera
// 4000 is some invented constant to bring distance to ~[-1,1].
float visibility = clamp((distance / 4000.0), 0.0, 1.0);
color = mix(vec4(1.0, 0.0, 0.0, 1.0), u_color, visibility);
if(distance < 0){
color = vec4(0.0, 0.0, 1.0, 1.0);
}
}
片段着色器:
varying vec4 color;
void main() {
gl_FragColor = color;
}
答案 0 :(得分:1)
如果要获取到相机的距离,在[-1,1]范围内,则可以使用协调的片段速度。剪辑空间坐标可以通过Perspective divide转换为规范化的设备坐标。规范化的设备坐标(x
,y
和z
的范围为[-1,1],可以轻松地将其转换为范围[0,1]:
gl_Position = u_mvp * a_pos; // clip space
vec3 ndc = gl_Position.xyz / gl_Position.w; // NDC in [-1, 1] (by perspective divide)
float depth = ndc.z * 0.5 + 0.5; // depth in [0, 1]