Как реализовать шейдер GLSL для наземного тумана

Я пытаюсь реализовать шейдер наземного тумана для моего рендеринга на местности. Техника описана в этой статье:http://www.iquilezles.org/www/articles/fog/fog.htm

Идея состоит в том, чтобы рассмотреть луч, идущий от камеры к фрагменту, и интегрировать функцию плотности тумана вдоль этого луча.

Вот мой код шейдера:

#version 330 core
in vec2 UV;
in vec3 posw;

out vec3 color;

uniform sampler2D tex;

uniform vec3 ambientLightColor;
uniform vec3 camPos;

const vec3 FogBaseColor = vec3(1., 1., 1.);

void main()
{
    vec3 light = ambientLightColor;
    vec TexBaseColor = texture(tex,UV).rgb;

    //***************************FOG********************************************
    vec3 camFrag = posw - camPos;
    float distance = length(camFrag);
    float a = 0.02;
    float b = 0.01;

    float fogAmount = a * exp(-camPos.z*b) * ( 1.0-exp( -distance*camFrag.z*b ) ) / (b*camFrag.z);
    color = mix( light*TexBaseColor, light*FogBaseColor, fogAmount );
}

Первое, что я не понимаю, как выбрать a и b и какова их физическая роль в функции плотности тумана.

Тогда результат не тот, который я ожидаю ... У меня есть туман земли, но переход fogAmount от 0 до 1 всегда центрирован на высоте камеры. Я пробовал много разных a и b, но когда у меня нет перехода на высоте камеры, у меня либо полный туман, либо нет тумана на любой местности.

Я проверил данные, которые я использую, и все правильно:

camPos.z - высота моей камерыcamFrag.z - вертикальная составляющая вектора, идущая от камеры к фрагменту.

Я не могу понять, какая часть уравнения вызывает это.

Есть идеи по этому поводу?

РЕДАКТИРОВАТЬ: Вот эффект, который я ищу:image1 image2

Ответы на вопрос(2)

Ваш ответ на вопрос