diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 96a3d1545..9e8bc0e98 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -774,7 +774,7 @@ void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, secto Fogball fogball; fogball.Position = FVector3(thing->Pos()); fogball.Radius = (float)thing->args[3]; - fogball.Color = FVector3(thing->args[0] * (1.0f / 255.0f), thing->args[1] * (1.0f / 255.0f), thing->args[2] * (1.0f / 255.0f)); + fogball.Color = FVector3(powf(thing->args[0] * (1.0f / 255.0f), 2.2), powf(thing->args[1] * (1.0f / 255.0f), 2.2), powf(thing->args[2] * (1.0f / 255.0f), 2.2)); fogball.Fog = (float)thing->Alpha; di->Fogballs.Push(fogball); return; diff --git a/wadsrc/static/shaders/scene/fogball.glsl b/wadsrc/static/shaders/scene/fogball.glsl index 6c2824505..08b4546f2 100644 --- a/wadsrc/static/shaders/scene/fogball.glsl +++ b/wadsrc/static/shaders/scene/fogball.glsl @@ -40,8 +40,14 @@ float FogSphereDensity(vec3 rayOrigin, vec3 rayDirection, vec3 sphereCenter, flo return (i2 - i1) * (3.0f / 4.0f); } +// Approximate sRGB/linear conversion +vec3 ToLinear(vec3 c) { return pow(c, vec3(2.2)); } +vec3 FromLinear(vec3 c) { return pow(c, vec3(1.0 / 2.2)); } + vec4 ProcessFogBalls(vec4 light) { + light.rgb = ToLinear(light.rgb); + vec3 rayOrigin = uCameraPos.xyz; float dbuffer = distance(pixelpos.xyz, uCameraPos.xyz); vec3 rayDirection = normalize(pixelpos.xyz - uCameraPos.xyz); @@ -59,5 +65,5 @@ vec4 ProcessFogBalls(vec4 light) light.rgb = mix(light.rgb, fogcolor * density, alpha); } - return light; + return vec4(FromLinear(light.rgb), light.a); }