So implementieren Sie einen GLSL-Shader für Bodennebel
Ich versuche, einen Bodennebel-Shader für meine Terrain-Rendering-Engine zu implementieren. Die Technik wird in diesem Artikel beschrieben:http://www.iquilezles.org/www/articles/fog/fog.htm
Die Idee ist, den Strahl, der von der Kamera zum Fragment geht, zu betrachten und die Nebeldichtefunktion entlang dieses Strahls zu integrieren.
Hier ist mein Shader-Code:
#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 );
}
Das erste ist, dass ich nicht verstehe, wie man a und b wählt und welche physikalische Rolle sie in der Nebeldichtefunktion spielen.
Dann ist das Ergebnis nicht das, was ich erwarte ... Ich habe einen Bodennebel, aber der Übergang von fogAmount von 0 zu 1 ist immer auf der Kamerahöhe zentriert. Ich habe viele verschiedene a und b ausprobiert, aber wenn ich in Kamerahöhe keinen Übergang habe, habe ich entweder ein voll beschlagenes oder gar kein beschlagenes Gelände.
Ich habe die von mir verwendeten Daten überprüft und alles ist korrekt:
camPos.z ist die Höhe meiner KameracamFrag.z ist die vertikale Komponente des Vektors, der von der Kamera zum Fragment verläuftIch kann nicht verstehen, welcher Teil der Gleichung dies verursacht.
Irgendeine Idee dazu?