X-Y-расстояние от камеры до объекта в вершинном шейдере

Я хочу показать туман/вид с воздуха в своем приложении. Но я хочу использовать только мировое расстояние x, y от камеры до модели, чтобы определить внешний вид.

Мне уже удалось получить подписанное z-расстояние от камеры до моделей с помощью этого расчета.

Глубина ВТМ

Красные объекты имеют положительное расстояние по оси z до камеры, синие — отрицательное, в отличие от этой реализации, где все значения кажутся положительными.

Вершинный шейдер:

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 до камеры?

person User Rebo    schedule 24.04.2019    source источник
comment
Вы уверены, что u_mv снова является матрицей представления модели, а не матрицей проекции представления модели?   -  person Rabbid76    schedule 24.04.2019
comment
Также не был уверен, что матрица u_mv отслеживает правильные значения, но она определенно отличается от других. Может забыл перевод здесь (сложно отлаживать работу других).   -  person User Rebo    schedule 24.04.2019


Ответы (1)


Если вы хотите получить расстояние до камеры в диапазоне [-1, 1], вы можете использовать скоординированный темп клипов. Координата пространства отсечения может быть преобразована в нормализованную координату устройства с помощью разделения перспективы . Нормализованные координаты устройства (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]
person Rabbid76    schedule 24.04.2019
comment
Вроде искал. Спасибо! - person User Rebo; 24.04.2019