Расчет координат тумана в OpenGL ES - PullRequest
0 голосов
/ 03 мая 2020

Найдены два способа вычисления координат тумана в вершинном шейдере:

#version 300 es
uniform mat4 u_mvMatrix;
in vec4 a_position;
smooth out float v_fog_factor;

const float startFog = 10.0;
const float endFog = 140.0;

float getFogFactor(float fogCoord) { // linear fog
    float factor = (endFog - fogCoord) / (endFog - startFog); 
    factor = 1.0 - clamp(factor, 0.0, 1.0);
    return factor;
}

void main() {
    vec4 v_eye_space_pos = u_mvMatrix * a_position;

    // VARIANT I: obtain cartesian coordinate z
    float fogCoord = abs(v_eye_space_pos.z / v_eye_space_pos.w);

    // VARIANT II: obtain distance
    float fogCoord = length(v_eye_space_pos);


    v_fog_factor = getFogFactor(fogCoord);
    ...
}

Не заметил визуальных различий.

Вопрос: Есть ли разница в этих два варианта? Если нет, какой из них лучше использовать с точки зрения производительности? Заранее спасибо!

1 Ответ

1 голос
/ 03 мая 2020

Найдено в литературе (Рэнди Дж. Рост, OpenGL): первый вариант - это аппроксимация значения глубины с использованием абсолютного значения координаты z в пространстве просмотра. При очень большом угле обзора такое приближение может спровоцировать заметный дефект изображения (небольшой туман на краю). В этом случае его можно рассчитать как расстояние от точки обзора до фрагмента (второй вариант). Этот метод включает вычисление квадрата root, что немного ухудшит производительность.

...