【问题标题】:X-Y-Distance from camera to object in vertex shader顶点着色器中从相机到对象的 X-Y-距离
【发布时间】:2019-04-24 14:07:34
【问题描述】:

我想在我的应用程序中显示一些雾/鸟瞰图。但我只想使用从相机到模型的 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;
}
  • 为什么会有负 z 值?还是很常见?
  • 如何计算 x,y 世界到相机的距离?

【问题讨论】:

  • 你确定u_mv是模型视图矩阵而不是模型视图投影矩阵吗?
  • 也不确定u_mv 矩阵是否跟踪正确的值,但它肯定与其他值不同。可能在这里忘记了翻译(有点难以调试其他人的工作)。

标签: opengl glsl shader perspectivecamera opengl-2.0


【解决方案1】:

如果你想获得到相机的距离,在 [-1, 1] 范围内,那么你可以使用剪辑速度协调。剪辑空间坐标可以通过Perspective divide 转换为标准化的设备坐标。标准化的设备坐标(xyz)在 [-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]

【讨论】:

  • 看起来我正在寻找。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2018-11-28
相关资源
最近更新 更多