Skip to content

Commit

Permalink
Better auto-exposure
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelMoroz committed Sep 17, 2019
1 parent 470ae6c commit afcdc41
Show file tree
Hide file tree
Showing 11 changed files with 20 additions and 34 deletions.
6 changes: 3 additions & 3 deletions game_folder/shaders/compute/auto_exposure_weighting.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void main() {
float td = dot(dir.xyz, sph.xyz - pos.xyz);//depth

vec4 color = imageLoad(final_color, global_pos);
//float weight = pow(max(1.0 - length(vec2(global_pos)/img_size - 0.5), 0.f),2);
float weight = 1.f/(td + Camera.size + 1e-5);
imageStore(output_w, global_pos, vec4(length(color.xyz)*weight, weight, 0, 1));
float weight = pow(max(1.0 - length(vec2(global_pos)/img_size - 0.5), 0.f),6);
weight *= sqrt(1.f/(td + Camera.size + 1e-5));
imageStore(output_w, global_pos, vec4(max(color.x,max(color.y,color.z))*weight, weight, 0, 1));
}
7 changes: 0 additions & 7 deletions game_folder/shaders/compute/bloom.glsl
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
vec3 bloom_radius(vec3 color, float exposure)
{
color = clamp(color*exposure, 0, 30)/exposure;
vec3 radius = 0.5f * tanh(2*(color * exposure - Camera.bloomtreshold)) + 0.5f;
return radius;
}

vec3 bloom_treshold(vec3 color, float exposure)
{
color = clamp(color*exposure, 0, 30)/exposure;
Expand Down
3 changes: 1 addition & 2 deletions game_folder/shaders/compute/camera.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ struct glcamera
float speckle;
float size;
float bloomintensity;
float bloomtreshold;
float bloomradius;
bool cross_eye;
float eye_separation;
Expand Down Expand Up @@ -51,7 +50,7 @@ ray get_ray(vec2 screen_pos)

vec2 shift = Camera.FOV*(2.f*screen_pos - 1.f)*vec2(Camera.aspect_ratio, -1.f);
ray cray;
cray.pos = Camera.position + (Camera.cross_eye?(Camera.dirx*Camera.size*delta):(Camera.size*(Camera.dirx*(shift.x) + Camera.diry*shift.y)));
cray.pos = Camera.position + (Camera.cross_eye?(Camera.dirx*delta):(Camera.size*(Camera.dirx*(shift.x) + Camera.diry*shift.y)));
cray.dir = normalize(Camera.dirx*shift.x + Camera.diry*shift.y + Camera.dirz);
float aspect_ratio_ratio = Camera.aspect_ratio/(Camera.resolution.x/Camera.resolution.y);
fovray = 1.41*Camera.FOV*max(1.f/aspect_ratio_ratio, aspect_ratio_ratio)/Camera.resolution.x; //pixel FOV
Expand Down
2 changes: 1 addition & 1 deletion game_folder/shaders/compute/distance_estimators.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ void scene_material(vec3 pos, inout vec4 color, inout vec2 pbr)
if (color_m.w < color.w)
{
color = color_m;
if(MARBLE_MODE == 1)
if(MARBLE_MODE <= 1)
{
pbr = vec2(1,0.2);
}
Expand Down
4 changes: 1 addition & 3 deletions src/Camera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,9 @@ void Camera::SetDirZ(vec3 dir)
dirz.z = dir.z;
}

#define target_brightness 0.85f
void Camera::UpdateExposure(float illumination)
{
exposure += auto_exposure_speed*(target_brightness - illumination)*exposure;
exposure += auto_exposure_speed*(auto_exposure_target - illumination)*exposure;
}

vec3 Camera::GetPosition()
Expand Down Expand Up @@ -158,7 +157,6 @@ gl_camera Camera::GetGLdata()
cam.speckle = speckle;
cam.size = size;
cam.bloomintensity = bloomintensity;
cam.bloomtreshold = bloomtreshold;
cam.bloomradius = bloomradius;

//data for the renderer
Expand Down
6 changes: 3 additions & 3 deletions src/Camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ typedef struct
float speckle;
float size;
float bloomintensity;
float bloomtreshold;
float bloomradius;
bool cross_eye;
float eye_separation;
Expand All @@ -38,7 +37,7 @@ class Camera
};

Camera() : alpha(0), beta(0), gamma(0), cur_mode(Free), radius(1.f), auto_exposure_speed(0.5),
smooth(0.3f), FOV(75.f), focus(1e10), bokeh(0), mblur(0.008), speckle(10), size(0), exposure(0.7f), bloomintensity(0.05), bloomtreshold(2.7), bloomradius(3)
smooth(0.3f), FOV(75.f), focus(1e10), bokeh(0), mblur(0.008), speckle(10), size(0), exposure(0.7f), bloomintensity(0.05), bloomradius(3)
{
//camera directions
dirx = quat(0, 1, 0, 0);
Expand Down Expand Up @@ -91,11 +90,12 @@ class Camera
void Update(float dt);

//exposure, motion blur and speckle radius
float exposure, mblur, speckle, bloomintensity, bloomtreshold, bloomradius;
float exposure, mblur, speckle, bloomintensity, bloomradius;
bool cross_eye;
float eye_separation;

float auto_exposure_speed;
float auto_exposure_target;
private:
CameraMode cur_mode;

Expand Down
9 changes: 4 additions & 5 deletions src/Gamemodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -866,8 +866,8 @@ void InitializeRendering(std::string config)

renderer_ptr->camera.bloomintensity = SETTINGS.stg.bloom_intensity;
renderer_ptr->camera.bloomradius = SETTINGS.stg.bloom_radius;
renderer_ptr->camera.bloomtreshold = SETTINGS.stg.bloom_treshold;
renderer_ptr->camera.auto_exposure_speed = SETTINGS.stg.auto_exposure_speed;
renderer_ptr->camera.auto_exposure_target = SETTINGS.stg.auto_exposure_target;
renderer_ptr->camera.SetMotionBlur(SETTINGS.stg.motion_blur);
renderer_ptr->camera.SetFOV(SETTINGS.stg.FOV);
renderer_ptr->camera.cross_eye = SETTINGS.stg.cross_eye;
Expand Down Expand Up @@ -1105,23 +1105,22 @@ void InitializeATBWindows(float* fps, float *target_fps)
TwAddVarRW(overlays_ptr->settings, "Bloom downscaling", TW_TYPE_INT32, &SETTINGS.stg.bloom_resolution, "min=1 max=8 group='Rendering settings'");

TwAddVarRW(overlays_ptr->settings, "Auto-exposure speed", TW_TYPE_FLOAT, &SETTINGS.stg.auto_exposure_speed, "min=0 step=0.01 max=1 group='Graphics settings' help='The speed at which the camera adapts to the scene brightness' ");
TwAddVarRW(overlays_ptr->settings, "Auto-exposure target brightness", TW_TYPE_FLOAT, &SETTINGS.stg.auto_exposure_target, "min=0 step=0.01 max=1 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "FOV", TW_TYPE_FLOAT, &SETTINGS.stg.FOV, "min=30 step=1 max=180 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "VSYNC", TW_TYPE_BOOLCPP, &SETTINGS.stg.VSYNC, "group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Shadows", TW_TYPE_BOOLCPP, &SETTINGS.stg.shadows, "group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Reflection and Refraction", TW_TYPE_BOOLCPP, &SETTINGS.stg.refl_refr, "group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Volumetric fog", TW_TYPE_BOOLCPP, &SETTINGS.stg.fog, "group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Volumetric fog(TODO)", TW_TYPE_BOOLCPP, &SETTINGS.stg.fog, "group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Blur", TW_TYPE_FLOAT, &SETTINGS.stg.motion_blur, "min=0 step=0.001 max=0.75 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Exposure", TW_TYPE_FLOAT, &SETTINGS.stg.exposure, "min=0 max=5 step=0.001 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Bloom Treshold", TW_TYPE_FLOAT, &SETTINGS.stg.bloom_treshold, "min=0 max=5 step=0.001 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Bloom Intensity", TW_TYPE_FLOAT, &SETTINGS.stg.bloom_intensity, "min=0 max=5 step=0.001 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Bloom Radius", TW_TYPE_FLOAT, &SETTINGS.stg.bloom_radius, "min=1 max=10 step=0.1 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Material gamma", TW_TYPE_FLOAT, &SETTINGS.stg.gamma_material, "min=0 max=4 step=0.1 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Sky gamma", TW_TYPE_FLOAT, &SETTINGS.stg.gamma_sky, "min=0 max=4 step=0.1 group='Graphics settings'");
TwAddVarRW(overlays_ptr->settings, "Camera gamma", TW_TYPE_FLOAT, &SETTINGS.stg.gamma_camera, "min=0 max=4 step=0.1 group='Graphics settings'");


TwAddVarRW(overlays_ptr->settings, "Language", Languages, &SETTINGS.stg.language, "group='Gameplay settings'");
TwEnumVal marble_type[] = { { 0, "Glass" },
TwEnumVal marble_type[] = { { 0, "Glass" },
{ 1, "Metal" },
{ 2, "Ceramic" } };

Expand Down
4 changes: 3 additions & 1 deletion src/Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,8 @@ void Renderer::Render()
{
glBindImageTexture(tex_id++, extr_text.getNativeHandle(), 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
}

glBindImageTexture(tex_id++, illumination_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);

shader_pipeline[i].setCamera(camera.GetGLdata());
shader_pipeline[i].Run(global_size[i]);
Expand Down Expand Up @@ -299,7 +301,7 @@ float Renderer::EvaluateAvgIllumination()
}

//get the average of the texture using mipmaps
float avg[16*4];
float avg[4];
int mipmap_level = floor(log2(float(std::max(width, height))));
glGenerateMipmap(GL_TEXTURE_2D);
glGetTexImage(GL_TEXTURE_2D, mipmap_level, GL_RGBA, GL_FLOAT, avg);
Expand Down
6 changes: 1 addition & 5 deletions src/Scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -798,6 +798,7 @@ void Scene::WriteRenderer(Renderer & rd)
rd.camera.SetDirY(diry);
rd.camera.SetDirZ(dirz);
rd.camera.SetCameraSize(camera_size*level_copy.marble_rad / 0.035f);
rd.camera.eye_separation = SETTINGS.stg.eye_separation*level_copy.marble_rad / 0.035f;

//write all the uniform values to the rendering pipeline
for (auto &shader : rd.shader_pipeline)
Expand Down Expand Up @@ -845,7 +846,6 @@ void Scene::WriteShader(ComputeShader& shader)
shader.setUniform("LIGHT_COLOR", vec3(level_copy.light_col[0], level_copy.light_col[1], level_copy.light_col[2]));

shader.setUniform("iMarbleRad", level_copy.marble_rad);

shader.setUniform("iFlagScale", level_copy.planet ? -level_copy.marble_rad : level_copy.marble_rad);

shader.setUniform("iFracScale", frac_params_smooth[0]);
Expand All @@ -854,12 +854,8 @@ void Scene::WriteShader(ComputeShader& shader)
shader.setUniform("iFracShift", vec3(frac_params_smooth[3], frac_params_smooth[4], frac_params_smooth[5]));
shader.setUniform("iFracCol", vec3(frac_params_smooth[6], frac_params_smooth[7], frac_params_smooth[8]));

shader.setUniform("iExposure", exposure);


shader.setUniform("SHADOWS_ENABLED", Shadows_Enabled);
shader.setUniform("FOG_ENABLED", Fog_Enabled);
shader.setUniform("CAMERA_SIZE", camera_size*level_copy.marble_rad / 0.035f);
shader.setUniform("FRACTAL_ITER", level_copy.FractalIter);
shader.setUniform("REFL_REFR_ENABLED", Refl_Refr_Enabled);
shader.setUniform("MARBLE_MODE", MarbleType);
Expand Down
6 changes: 3 additions & 3 deletions src/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ struct MainSettings
bool fog;

float bloom_intensity;
float bloom_treshold;
float bloom_radius;
float gamma;
float FOV;
Expand All @@ -63,13 +62,14 @@ struct MainSettings

bool cross_eye;
float eye_separation;
float auto_exposure_speed;
float auto_exposure_speed;
float auto_exposure_target;
};

extern TwEnumVal resolutions[];

static const MainSettings default_settings = { 6,
10, 5, 2, 3, 0, true, true, true, 0.05, 2.7, 4, 2.2, 90, 20, 20, 0.005, 0.2, false, 0.005, 0.45, 0, false, true, 0, true, 0.7, 0.6, 2.2, false, -0.35, 0.08};
10, 5, 2, 3, 0, true, true, true, 0.06, 9, 2.2, 90, 20, 20, 0.005, 0.2, false, 0.005, 0.45, 0, false, true, 0, true, 0.7, 0.6, 2.2, false, -0.35, 0.2, 0.65};


class AllSettings
Expand Down
1 change: 0 additions & 1 deletion src/Shaders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ void ComputeShader::setCamera(gl_camera cam)
setUniform("Camera.resolution", cam.resolution);
setUniform("Camera.size", cam.size);
setUniform("Camera.bloomradius", cam.bloomradius);
setUniform("Camera.bloomtreshold", cam.bloomtreshold);
setUniform("Camera.bloomintensity", cam.bloomintensity);
setUniform("Camera.speckle", cam.speckle);
setUniform("Camera.cross_eye", cam.cross_eye);
Expand Down

0 comments on commit afcdc41

Please sign in to comment.