Как реализовать шейдер 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 - вертикальная составляющая вектора, идущая от камеры к фрагменту.Я не могу понять, какая часть уравнения вызывает это.
Есть идеи по этому поводу?