Added reflection mode settings

This commit is contained in:
Joshua Barretto 2022-10-23 20:03:21 +01:00
parent b85fd11443
commit 40e47b4f3e
35 changed files with 257 additions and 194 deletions

View File

@ -25,8 +25,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Pets can now be traded with. - Pets can now be traded with.
- Crafting recipe for black lantern - Crafting recipe for black lantern
- Added redwood and dead trees - Added redwood and dead trees
- Experimental screen-space reflection and refraction shaders
- Water will now move according to its apparent flow direction - Water will now move according to its apparent flow direction
- Added screen-space reflection and refraction shaders
- Added reflection quality setting
### Changed ### Changed
- Use fluent for translations - Use fluent for translations

View File

@ -72,9 +72,13 @@ hud-settings-antialiasing_mode = AntiAliasing Mode
hud-settings-upscale_factor = Internal Resolution hud-settings-upscale_factor = Internal Resolution
hud-settings-cloud_rendering_mode = Cloud Rendering Mode hud-settings-cloud_rendering_mode = Cloud Rendering Mode
hud-settings-fluid_rendering_mode = Fluid Rendering Mode hud-settings-fluid_rendering_mode = Fluid Rendering Mode
hud-settings-fluid_rendering_mode-cheap = Cheap hud-settings-fluid_rendering_mode-low = Low
hud-settings-fluid_rendering_mode-medium = Medium hud-settings-fluid_rendering_mode-medium = Medium
hud-settings-fluid_rendering_mode-high = High hud-settings-fluid_rendering_mode-high = High
hud-settings-reflection_rendering_mode = Reflection Rendering Mode
hud-settings-reflection_rendering_mode-low = Low
hud-settings-reflection_rendering_mode-medium = Medium
hud-settings-reflection_rendering_mode-high = High
hud-settings-cloud_rendering_mode-minimal = Minimal hud-settings-cloud_rendering_mode-minimal = Minimal
hud-settings-cloud_rendering_mode-low = Low hud-settings-cloud_rendering_mode-low = Low
hud-settings-cloud_rendering_mode-medium = Medium hud-settings-cloud_rendering_mode-medium = Medium

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -92,11 +92,12 @@ void main() {
float cloud_blend = 1.0; float cloud_blend = 1.0;
if (color.a < 1.0) { if (color.a < 1.0) {
vec2 nz = vec2(0); vec2 nz = vec2(0);
#ifdef EXPERIMENTAL_SCREENSPACEREFRACTION uvec2 col_sz = textureSize(sampler2D(t_src_color, s_src_color), 0);
#if (REFLECTION_MODE >= REFLECTION_MODE_MEDIUM)
nz = (vec2( nz = (vec2(
noise_3d(vec3((wpos.xy + focus_off.xy) * 0.1, tick.x * 0.2 + wpos.x * 0.01)).x, noise_3d(vec3((wpos.xy + focus_off.xy) * 0.1, tick.x * 0.2 + wpos.x * 0.01)).x,
noise_3d(vec3((wpos.yx + focus_off.yx) * 0.1, tick.x * 0.2 + wpos.y * 0.01)).x noise_3d(vec3((wpos.yx + focus_off.yx) * 0.1, tick.x * 0.2 + wpos.y * 0.01)).x
) - 0.5) * color.a; ) - 0.5) * (dir.z < 0.0 ? color.a : 1.0);
const float n2 = 1.3325; const float n2 = 1.3325;
vec3 refr_dir; vec3 refr_dir;
@ -105,33 +106,25 @@ void main() {
// vec3 surf_norm = normalize(vec3(nz * 0.03 / (1.0 + dist * 0.1), 1)); // vec3 surf_norm = normalize(vec3(nz * 0.03 / (1.0 + dist * 0.1), 1));
// refr_dir = refract(dir, surf_norm * -sign(dir.z), 1.0 / n2); // refr_dir = refract(dir, surf_norm * -sign(dir.z), 1.0 / n2);
// } else { // } else {
refr_dir = normalize(dir + vec3(nz / dist, 0.0)); refr_dir = normalize(dir + vec3(nz * 1.5 / dist, 0.0));
// } // }
vec4 clip = (all_mat * vec4(cam_pos.xyz + refr_dir, 1.0)); vec4 clip = (all_mat * vec4(cam_pos.xyz + refr_dir, 1.0));
vec2 new_uv = (clip.xy / max(clip.w, 0)) * 0.5 * vec2(1, -1) + 0.5; vec2 new_uv = (clip.xy / max(clip.w, 0)) * 0.5 * vec2(1, -1) + 0.5;
float uv_merge = clamp((1.0 - abs(new_uv.y - 0.5) * 2) * 5.0, 0, 1); float uv_merge = clamp((1.0 - abs(new_uv.y - 0.5) * 2) * 5.0, 0, 1);
new_uv = mix(uv, new_uv, uv_merge);
uvec2 sz = textureSize(sampler2D(t_src_color, s_src_color), 0); vec4 new_col = texelFetch(sampler2D(t_src_color, s_src_color), clamp(ivec2(new_uv * col_sz), ivec2(0), ivec2(col_sz) - 1), 0);
vec4 new_col = texelFetch(sampler2D(t_src_color, s_src_color), clamp(ivec2(mix(uv, new_uv, uv_merge) * sz), ivec2(0), ivec2(sz) - 1), 0);
if (new_col.a < 1.0) { if (new_col.a < 1.0) {
color = new_col; color = new_col;
dir = refr_dir;
} }
#else
#if (FLUID_MODE >= FLUID_MODE_MEDIUM)
if (dir.z < 0.0) {
nz = (vec2(
noise_3d(vec3((wpos.xy + focus_off.xy) * 0.1, tick.x * 0.2 + wpos.x * 0.01)).x,
noise_3d(vec3((wpos.yx + focus_off.yx) * 0.1, tick.x * 0.2 + wpos.y * 0.01)).x
) - 0.5);
}
#endif
#endif #endif
{ {
cloud_blend = 1.0 - color.a; cloud_blend = 1.0 - color.a;
#ifdef EXPERIMENTAL_SCREENSPACEREFLECTIONS #if (FLUID_MODE >= FLUID_MODE_MEDIUM)
if (dir.z < 0.0) { if (dir.z < 0.0) {
vec3 surf_norm = normalize(vec3(nz * 0.3 / (1.0 + dist * 0.1), 1)); vec3 surf_norm = normalize(vec3(nz * 0.3 / (1.0 + dist * 0.1), 1));
vec3 refl_dir = reflect(dir, surf_norm); vec3 refl_dir = reflect(dir, surf_norm);
@ -139,7 +132,7 @@ void main() {
vec4 clip = (all_mat * vec4(cam_pos.xyz + refl_dir, 1.0)); vec4 clip = (all_mat * vec4(cam_pos.xyz + refl_dir, 1.0));
vec2 new_uv = (clip.xy / max(clip.w, 0)) * 0.5 * vec2(1, -1) + 0.5; vec2 new_uv = (clip.xy / max(clip.w, 0)) * 0.5 * vec2(1, -1) + 0.5;
#ifdef EXPERIMENTAL_SCREENSPACEREFLECTIONSCASTING #if (REFLECTION_MODE >= REFLECTION_MODE_HIGH)
vec3 ray_end = wpos + refl_dir * 5.0 * dist; vec3 ray_end = wpos + refl_dir * 5.0 * dist;
// Trace through the screen-space depth buffer to find the ray intersection // Trace through the screen-space depth buffer to find the ray intersection
const int MAIN_ITERS = 64; const int MAIN_ITERS = 64;
@ -153,7 +146,7 @@ void main() {
float d = -depth_at(suv); float d = -depth_at(suv);
if (d < svpos.z * 0.8 && d > svpos.z * 0.999) { if (d < svpos.z * 0.8 && d > svpos.z * 0.999) {
// Don't cast into water! // Don't cast into water!
if (texture(sampler2D(t_src_color, s_src_color), suv).a >= 1.0) { if (texelFetch(sampler2D(t_src_color, s_src_color), clamp(ivec2(suv * col_sz), ivec2(0), ivec2(col_sz) - 1), 0).a >= 1.0) {
/* t -= 1.0 / float(MAIN_ITERS); */ /* t -= 1.0 / float(MAIN_ITERS); */
// Do a bit of extra iteration to try to refine the estimate // Do a bit of extra iteration to try to refine the estimate
const int ITERS = 8; const int ITERS = 8;
@ -187,23 +180,19 @@ void main() {
); );
if (merge > 0.0) { if (merge > 0.0) {
vec3 new_col = texture(sampler2D(t_src_color, s_src_color), new_uv).rgb; vec3 new_col = texelFetch(sampler2D(t_src_color, s_src_color), clamp(ivec2(new_uv * col_sz), ivec2(0), ivec2(col_sz) - 1), 0).rgb;
new_col = get_cloud_color(new_col.rgb, refl_dir, wpos, time_of_day.x, distance(new_wpos, wpos.xyz), 1.0); new_col = get_cloud_color(new_col.rgb, refl_dir, wpos, time_of_day.x, distance(new_wpos, wpos.xyz), 1.0);
color.rgb = mix(color.rgb, new_col, merge * color.a); color.rgb = mix(color.rgb, new_col, min(merge * (color.a * 2.0), 1.0));
cloud_blend = 1;
} else {
cloud_blend = 1;
} }
cloud_blend = 1;
} else { } else {
#else #else
{ {
#endif #endif
cloud_blend = 1; cloud_blend = 1;
//dist = DIST_CAP;
} }
} }
} }
/* color.rgb = vec3(sin(depth_at(uv) * 3.14159 * 2) * 0.5 + 0.5); */
color.rgb = mix(color.rgb, get_cloud_color(color.rgb, dir, cam_pos.xyz, time_of_day.x, dist, 1.0), cloud_blend); color.rgb = mix(color.rgb, get_cloud_color(color.rgb, dir, cam_pos.xyz, time_of_day.x, dist, 1.0), cloud_blend);
#if (CLOUD_MODE == CLOUD_MODE_NONE) #if (CLOUD_MODE == CLOUD_MODE_NONE)

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -8,7 +8,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -139,7 +139,7 @@ void main() {
float moon_shade_frac = horizon_at(f_pos, moon_dir); */ float moon_shade_frac = horizon_at(f_pos, moon_dir); */
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_LOW)
float f_alt = f_pos.z; float f_alt = f_pos.z;
#endif #endif

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -114,7 +114,7 @@ void main() {
vec3 moon_dir = get_moon_dir(time_of_day.x); */ vec3 moon_dir = get_moon_dir(time_of_day.x); */
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_LOW)
float f_alt = f_pos.z; float f_alt = f_pos.z;
#endif #endif

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -80,14 +80,16 @@ vec4 wave_height(vec4 posx, vec4 posy) {
float speed = 1.0; float speed = 1.0;
posx *= 0.2; posx *= 0.2;
posy *= 0.2; posy *= 0.2;
const float drag_factor = 0.03; const float drag_factor = 0.035;
const float iters = 21; const int iters = 21;
const float scale = 25.0;
#else #else
float speed = 2.0; float speed = 2.0;
posx *= 0.3; posx *= 0.3;
posy *= 0.3; posy *= 0.3;
const float drag_factor = 0.04; const float drag_factor = 0.04;
const float iters = 11; const int iters = 11;
const float scale = 5.0;
#endif #endif
const float iter_shift = (3.14159 * 2.0) / 7.3; const float iter_shift = (3.14159 * 2.0) / 7.3;
@ -104,7 +106,7 @@ vec4 wave_height(vec4 posx, vec4 posy) {
phase *= 1.2; phase *= 1.2;
speed += speed_per_iter; speed += speed_per_iter;
} }
return w / ws * 5.0; return w / ws * scale;
} }
float wave_height_vel(vec2 pos) { float wave_height_vel(vec2 pos) {
@ -213,7 +215,7 @@ void main() {
vec3 water_color = (1.0 - MU_WATER) * MU_SCATTER; vec3 water_color = (1.0 - MU_WATER) * MU_SCATTER;
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_LOW)
float f_alt = f_pos.z; float f_alt = f_pos.z;
#endif #endif
@ -266,7 +268,7 @@ void main() {
// float shade_frac = /*1.0;*/sun_shade_frac + moon_shade_frac; // float shade_frac = /*1.0;*/sun_shade_frac + moon_shade_frac;
vec3 reflect_color; vec3 reflect_color;
#if (FLUID_MODE == FLUID_MODE_HIGH) #if (REFLECTION_MODE >= REFLECTION_MODE_MEDIUM)
reflect_color = get_sky_color(ray_dir, time_of_day.x, f_pos, vec3(-100000), 0.125, true, 1.0, true, sun_shade_frac); reflect_color = get_sky_color(ray_dir, time_of_day.x, f_pos, vec3(-100000), 0.125, true, 1.0, true, sun_shade_frac);
reflect_color = get_cloud_color(reflect_color, ray_dir, f_pos.xyz, time_of_day.x, 100000.0, 0.1); reflect_color = get_cloud_color(reflect_color, ray_dir, f_pos.xyz, time_of_day.x, 100000.0, 0.1);
#else #else
@ -408,7 +410,11 @@ void main() {
min_refl = min(emitted_light.r, min(emitted_light.g, emitted_light.b)); min_refl = min(emitted_light.r, min(emitted_light.g, emitted_light.b));
} else { } else {
// Hack to make the opacity of the surface fade when underwater to avoid artifacts // Hack to make the opacity of the surface fade when underwater to avoid artifacts
opacity = min(sqrt(max(opacity, clamp((f_pos.z - cam_pos.z) * 0.05, 0.0, 1.0))), 1.0); if (dot(refract_ray_dir, cam_to_frag) > 0.0) {
opacity = 0.99;
} else {
opacity = min(sqrt(max(opacity, clamp((f_pos.z - cam_pos.z) * 0.05, 0.0, 1.0))), 0.99);
}
} }
vec4 color = vec4(surf_color, opacity);// * (1.0 - /*log(1.0 + cam_attenuation)*//*cam_attenuation*/1.0 / (2.0 - log_cam))); vec4 color = vec4(surf_color, opacity);// * (1.0 - /*log(1.0 + cam_attenuation)*//*cam_attenuation*/1.0 / (2.0 - log_cam)));
// vec4 color = vec4(surf_color, mix(1.0, 1.0 / (1.0 + /*0.25 * *//*diffuse_light*/(/*f_light * point_shadow*/reflected_light_point)), passthrough)); // vec4 color = vec4(surf_color, mix(1.0, 1.0 / (1.0 + /*0.25 * *//*diffuse_light*/(/*f_light * point_shadow*/reflected_light_point)), passthrough));

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -232,9 +232,6 @@ vec3 get_cloud_color(vec3 surf_color, vec3 dir, vec3 origin, const float time_of
vec3 moon_color = get_moon_color(); vec3 moon_color = get_moon_color();
// Clouds aren't visible underwater // Clouds aren't visible underwater
#ifdef IS_POSTPROCESS
if (medium.x != 1) {
#endif
float cdist = max_dist; float cdist = max_dist;
float ldist = cdist; float ldist = cdist;
// i is an emergency brake // i is an emergency brake
@ -315,9 +312,6 @@ vec3 get_cloud_color(vec3 surf_color, vec3 dir, vec3 origin, const float time_of
#endif #endif
#endif #endif
} }
#ifdef IS_POSTPROCESS
}
#endif
// Underwater light attenuation // Underwater light attenuation
surf_color = water_diffuse(surf_color, dir, max_dist); surf_color = water_diffuse(surf_color, dir, max_dist);

View File

@ -6,10 +6,14 @@
#define VOXYGEN_COMPUTATION_PREFERENCE_FRAGMENT 0 #define VOXYGEN_COMPUTATION_PREFERENCE_FRAGMENT 0
#define VOXYGEN_COMPUTATION_PREFERENCE_VERTEX 1 #define VOXYGEN_COMPUTATION_PREFERENCE_VERTEX 1
#define FLUID_MODE_CHEAP 0 #define FLUID_MODE_LOW 0
#define FLUID_MODE_MEDIUM 1 #define FLUID_MODE_MEDIUM 1
#define FLUID_MODE_HIGH 2 #define FLUID_MODE_HIGH 2
#define REFLECTION_MODE_LOW 0
#define REFLECTION_MODE_MEDIUM 1
#define REFLECTION_MODE_HIGH 2
#define CLOUD_MODE_NONE 0 #define CLOUD_MODE_NONE 0
#define CLOUD_MODE_MINIMAL 1 #define CLOUD_MODE_MINIMAL 1
#define CLOUD_MODE_LOW 2 #define CLOUD_MODE_LOW 2

View File

@ -138,7 +138,7 @@ float alt_at(vec2 pos) {
float alt_at_real(vec2 pos) { float alt_at_real(vec2 pos) {
// Basic idea: only really need the real altitude for an accurate water height estimation, so if we are in the cheap shader take a shortcut. // Basic idea: only really need the real altitude for an accurate water height estimation, so if we are in the cheap shader take a shortcut.
// #if (FLUID_MODE == FLUID_MODE_CHEAP) // #if (FLUID_MODE == FLUID_MODE_LOW)
// return alt_at(pos); // return alt_at(pos);
// #elif (FLUID_MODE == FLUID_MODE_SHINY) // #elif (FLUID_MODE == FLUID_MODE_SHINY)
return (/*round*/(textureBicubic16(t_alt, s_alt, pos_to_tex(pos)).r * (/*1300.0*//*1278.7266845703125*/view_distance.w)) + /*140.0*/view_distance.z - focus_off.z); return (/*round*/(textureBicubic16(t_alt, s_alt, pos_to_tex(pos)).r * (/*1300.0*//*1278.7266845703125*/view_distance.w)) + /*140.0*/view_distance.z - focus_off.z);

View File

@ -503,7 +503,12 @@ float is_star_at(vec3 dir) {
//return 0.0; //return 0.0;
return 50.0 * max(sun_dir.z, 0.1) / (1.0 + pow(dist * 750, 8)); #if (CLOUD_MODE == CLOUD_MODE_NONE)
const float power = 5.0;
#else
const float power = 50.0;
#endif
return power * max(sun_dir.z, 0.1) / (1.0 + pow(dist * 750, 8));
} }
vec3 get_sky_light(vec3 dir, float time_of_day, bool with_stars) { vec3 get_sky_light(vec3 dir, float time_of_day, bool with_stars) {
@ -624,21 +629,22 @@ vec3 get_sky_color(vec3 dir, float time_of_day, vec3 origin, vec3 f_pos, float q
vec3 moon_halo_color = MOON_HALO_COLOR; vec3 moon_halo_color = MOON_HALO_COLOR;
float moon_halo_power = 20.0; float moon_halo_power = 20.0;
vec3 moon_surf = vec3(0);
if (with_features) {
float angle = 0.00035;
moon_surf = clamp((dot(dir, -moon_dir) - (1.0 - angle)) * 4 / angle, 0, 1) * MOON_SURF_COLOR;
}
#if (CLOUD_MODE == CLOUD_MODE_NONE) #if (CLOUD_MODE == CLOUD_MODE_NONE)
if (true) { if (true) {
#else #else
if (fake_clouds || medium.x == MEDIUM_WATER) { if (fake_clouds || medium.x == MEDIUM_WATER) {
#endif #endif
moon_halo_power = 50.0; moon_halo_power = 50.0;
moon_halo_color *= 0.02; moon_halo_color *= 0.2;
moon_surf *= 0.05;
} }
vec3 moon_halo = moon_halo_color * pow(max(dot(dir, -moon_dir), 0), moon_halo_power); vec3 moon_halo = moon_halo_color * pow(max(dot(dir, -moon_dir), 0), moon_halo_power);
vec3 moon_surf = vec3(0);
if (with_features) {
float angle = 0.00035;
moon_surf = clamp((dot(dir, -moon_dir) - (1.0 - angle)) * 4 / angle, 0, 1) * MOON_SURF_COLOR;
}
vec3 moon_light = moon_halo + moon_surf; vec3 moon_light = moon_halo + moon_surf;
// Replaced all clamp(sun_dir, 0, 1) with max(sun_dir, 0) because sun_dir is calculated from sin and cos, which are never > 1 // Replaced all clamp(sun_dir, 0, 1) with max(sun_dir, 0) because sun_dir is calculated from sin and cos, which are never > 1

View File

@ -7,7 +7,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -9,7 +9,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -11,7 +11,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -11,7 +11,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -7,7 +7,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -43,7 +43,7 @@ void main() {
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_LOW)
float f_alt = f_pos.z; float f_alt = f_pos.z;
#endif #endif

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -448,7 +448,7 @@ void main() {
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float shadow_alt = /*f_pos.z;*/alt_at(f_pos.xy);//max(alt_at(f_pos.xy), f_pos.z); float shadow_alt = /*f_pos.z;*/alt_at(f_pos.xy);//max(alt_at(f_pos.xy), f_pos.z);
// float shadow_alt = f_pos.z; // float shadow_alt = f_pos.z;
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_LOW)
float shadow_alt = f_pos.z; float shadow_alt = f_pos.z;
#endif #endif

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -44,7 +44,7 @@ void main() {
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_LOW)
float f_alt = f_pos.z; float f_alt = f_pos.z;
#endif #endif

View File

@ -7,7 +7,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -288,7 +288,7 @@ void main() {
vec4 final_color = aa_color; vec4 final_color = aa_color;
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
if (medium.x == MEDIUM_WATER) { if (medium.x == MEDIUM_WATER) {
final_color *= vec4(0.2, 0.2, 0.8, 1.0); final_color *= vec4(0.2, 0.2, 0.8, 1.0);
} }

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -7,7 +7,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -9,7 +9,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -55,5 +55,5 @@ void main() {
} */ } */
vec3 wpos = cam_pos.xyz + /*normalize(f_pos)*/cam_dir * dist; vec3 wpos = cam_pos.xyz + /*normalize(f_pos)*/cam_dir * dist;
tgt_color = vec4(cam_attenuation * get_sky_color(normalize(f_pos), time_of_day.x, cam_pos.xyz, wpos, 1.0, medium.x != MEDIUM_WATER, refractionIndex), 1.0); tgt_color = vec4(cam_attenuation * get_sky_color(normalize(f_pos), time_of_day.x, cam_pos.xyz, wpos, 1.0, true, refractionIndex, false, 1.0), 1.0);
} }

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_SPECULAR
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -53,7 +53,7 @@ void main() {
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_LOW)
float f_alt = f_pos.z; float f_alt = f_pos.z;
#endif #endif

View File

@ -7,7 +7,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE
@ -211,7 +211,7 @@ void main() {
#if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM) #if (SHADOW_MODE == SHADOW_MODE_CHEAP || SHADOW_MODE == SHADOW_MODE_MAP || FLUID_MODE >= FLUID_MODE_MEDIUM)
float f_alt = alt_at(f_pos.xy); float f_alt = alt_at(f_pos.xy);
#elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_CHEAP) #elif (SHADOW_MODE == SHADOW_MODE_NONE || FLUID_MODE == FLUID_MODE_LOW)
float f_alt = f_pos.z; float f_alt = f_pos.z;
#endif #endif
@ -234,7 +234,7 @@ void main() {
// Toggle to see rain_occlusion // Toggle to see rain_occlusion
// tgt_color = vec4(rain_occlusion_at(f_pos.xyz), 0.0, 0.0, 1.0); // tgt_color = vec4(rain_occlusion_at(f_pos.xyz), 0.0, 0.0, 1.0);
// return; // return;
#ifdef EXPERIMENTAL_PUDDLES #if (REFLECTION_MODE >= REFLECTION_MODE_HIGH)
float f_alpha = 1.0; float f_alpha = 1.0;
#else #else
const float f_alpha = 1.0; const float f_alpha = 1.0;
@ -249,17 +249,17 @@ void main() {
drop_pos.z *= 0.5 + hash_fast(uvec3(cell2d, 0)); drop_pos.z *= 0.5 + hash_fast(uvec3(cell2d, 0));
vec3 cell = vec3(cell2d, floor(drop_pos.z * drop_density.z)); vec3 cell = vec3(cell2d, floor(drop_pos.z * drop_density.z));
#ifdef EXPERIMENTAL_PUDDLES #if (REFLECTION_MODE >= REFLECTION_MODE_HIGH)
float puddle = clamp((noise_2d((f_pos.xy + focus_off.xy + vec2(0.1, 0)) * 0.03) - 0.5) * 20.0, 0.0, 1.0) float puddle = clamp((noise_2d((f_pos.xy + focus_off.xy + vec2(0.1, 0)) * 0.02) - 0.5) * 20.0, 0.0, 1.0)
* min(rain_density * 10.0, 1.0) * min(rain_density * 10.0, 1.0)
* clamp((f_sky_exposure - 0.95) * 50.0, 0.0, 1.0); * clamp((f_sky_exposure - 0.95) * 50.0, 0.0, 1.0);
#else #else
const float puddle = 1.0; const float puddle = 1.0;
#endif #endif
#ifdef EXPERIMENTAL_PUDDLES #if (REFLECTION_MODE >= REFLECTION_MODE_HIGH)
if (puddle > 0.0) { if (puddle > 0.0) {
f_alpha = puddle * 0.3 * max(1.0 + cam_to_frag.z, 0.3); f_alpha = puddle * 0.2 * max(1.0 + cam_to_frag.z, 0.3);
#ifdef EXPERIMENTAL_PUDDLEDETAILS #ifdef EXPERIMENTAL_PUDDLEDETAILS
float h = (noise_2d((f_pos.xy + focus_off.xy) * 0.3) - 0.5) * sin(tick.x * 8.0 + f_pos.x * 3) float h = (noise_2d((f_pos.xy + focus_off.xy) * 0.3) - 0.5) * sin(tick.x * 8.0 + f_pos.x * 3)
+ (noise_2d((f_pos.xy + focus_off.xy) * 0.6) - 0.5) * sin(tick.x * 3.5 - f_pos.y * 6); + (noise_2d((f_pos.xy + focus_off.xy) * 0.6) - 0.5) * sin(tick.x * 3.5 - f_pos.y * 6);
@ -287,10 +287,6 @@ void main() {
k_d += distort; k_d += distort;
k_s += distort; k_s += distort;
#ifdef EXPERIMENTAL_PUDDLES
/* puddle = mix(puddle, 1.0, distort * 10); */
#endif
f_norm.xy += (drop_pos - near_cell).xy f_norm.xy += (drop_pos - near_cell).xy
* max(1.0 - abs(dist - drop_rad) * 30, 0) * max(1.0 - abs(dist - drop_rad) * 30, 0)
* 500.0 * 500.0
@ -377,7 +373,7 @@ void main() {
float not_underground = clamp((f_pos.z - f_alt) / 128.0 + 1.0, 0.0, 1.0); float not_underground = clamp((f_pos.z - f_alt) / 128.0 + 1.0, 0.0, 1.0);
// To account for prior saturation // To account for prior saturation
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
f_light = f_light * sqrt(f_light); f_light = f_light * sqrt(f_light);
#else #else
f_light = faces_fluid ? not_underground : f_light * sqrt(f_light); f_light = faces_fluid ? not_underground : f_light * sqrt(f_light);

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -6,7 +6,7 @@
#define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY #define LIGHTING_REFLECTION_KIND LIGHTING_REFLECTION_KIND_GLOSSY
#if (FLUID_MODE == FLUID_MODE_CHEAP) #if (FLUID_MODE == FLUID_MODE_LOW)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_IMPORTANCE
#elif (FLUID_MODE >= FLUID_MODE_MEDIUM) #elif (FLUID_MODE >= FLUID_MODE_MEDIUM)
#define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE #define LIGHTING_TRANSPORT_MODE LIGHTING_TRANSPORT_MODE_RADIANCE

View File

@ -7,7 +7,7 @@ use crate::{
}, },
render::{ render::{
AaMode, BloomConfig, BloomFactor, BloomMode, CloudMode, FluidMode, LightingMode, AaMode, BloomConfig, BloomFactor, BloomMode, CloudMode, FluidMode, LightingMode,
PresentMode, RenderMode, ShadowMapMode, ShadowMode, UpscaleMode, PresentMode, ReflectionMode, RenderMode, ShadowMapMode, ShadowMode, UpscaleMode,
}, },
session::settings_change::Graphics as GraphicsChange, session::settings_change::Graphics as GraphicsChange,
settings::Fps, settings::Fps,
@ -90,6 +90,8 @@ widget_ids! {
cloud_mode_list, cloud_mode_list,
fluid_mode_text, fluid_mode_text,
fluid_mode_list, fluid_mode_list,
reflection_mode_text,
reflection_mode_list,
fullscreen_mode_text, fullscreen_mode_text,
fullscreen_mode_list, fullscreen_mode_list,
// //
@ -1038,10 +1040,10 @@ impl<'a> Widget for Video<'a> {
.color(TEXT_COLOR) .color(TEXT_COLOR)
.set(state.ids.fluid_mode_text, ui); .set(state.ids.fluid_mode_text, ui);
let mode_list = [FluidMode::Cheap, FluidMode::Medium, FluidMode::High]; let mode_list = [FluidMode::Low, FluidMode::Medium, FluidMode::High];
let mode_label_list = [ let mode_label_list = [
self.localized_strings self.localized_strings
.get_msg("hud-settings-fluid_rendering_mode-cheap"), .get_msg("hud-settings-fluid_rendering_mode-low"),
self.localized_strings self.localized_strings
.get_msg("hud-settings-fluid_rendering_mode-medium"), .get_msg("hud-settings-fluid_rendering_mode-medium"),
self.localized_strings self.localized_strings
@ -1065,13 +1067,56 @@ impl<'a> Widget for Video<'a> {
}))); })));
} }
// ReflectionMode
Text::new(
&self
.localized_strings
.get_msg("hud-settings-reflection_rendering_mode"),
)
.down_from(state.ids.fluid_mode_list, 8.0)
.font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR)
.set(state.ids.reflection_mode_text, ui);
let mode_list = [
ReflectionMode::Low,
ReflectionMode::Medium,
ReflectionMode::High,
];
let mode_label_list = [
self.localized_strings
.get_msg("hud-settings-reflection_rendering_mode-low"),
self.localized_strings
.get_msg("hud-settings-reflection_rendering_mode-medium"),
self.localized_strings
.get_msg("hud-settings-reflection_rendering_mode-high"),
];
// Get which fluid rendering mode is currently active
let selected = mode_list.iter().position(|x| *x == render_mode.reflection);
if let Some(clicked) = DropDownList::new(&mode_label_list, selected)
.w_h(400.0, 22.0)
.color(MENU_BG)
.label_color(TEXT_COLOR)
.label_font_id(self.fonts.cyri.conrod_id)
.down_from(state.ids.reflection_mode_text, 8.0)
.set(state.ids.reflection_mode_list, ui)
{
events.push(GraphicsChange::ChangeRenderMode(Box::new(RenderMode {
reflection: mode_list[clicked],
..render_mode.clone()
})));
}
// LightingMode // LightingMode
Text::new( Text::new(
&self &self
.localized_strings .localized_strings
.get_msg("hud-settings-lighting_rendering_mode"), .get_msg("hud-settings-lighting_rendering_mode"),
) )
.down_from(state.ids.fluid_mode_list, 8.0) .down_from(state.ids.reflection_mode_list, 8.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(TEXT_COLOR)

View File

@ -151,15 +151,15 @@ impl Default for CloudMode {
/// Fluid modes /// Fluid modes
#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] #[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)]
pub enum FluidMode { pub enum FluidMode {
/// "Cheap" water. This water implements no waves, no reflections, no /// "Low" water. This water implements no waves, no reflections, no
/// diffraction, and no light attenuation through water. As a result, /// diffraction, and no light attenuation through water. As a result,
/// it can be much cheaper than shiny reflection. /// it can be much cheaper than shiny reflection.
Cheap, Low,
High, High,
/// "Shiny" water. This water implements waves on the surfaces, some /// This water implements waves on the surfaces, some attempt at
/// attempt at reflections, and tries to compute accurate light /// reflections, and tries to compute accurate light attenuation through
/// attenuation through water (this is what results in the /// water (this is what results in the colors changing as you descend
/// colors changing as you descend into deep water). /// into deep water).
/// ///
/// Unfortunately, the way the engine is currently set up, calculating /// Unfortunately, the way the engine is currently set up, calculating
/// accurate attenuation is a bit difficult; we use estimates from /// accurate attenuation is a bit difficult; we use estimates from
@ -180,6 +180,23 @@ impl Default for FluidMode {
fn default() -> Self { FluidMode::Medium } fn default() -> Self { FluidMode::Medium }
} }
/// Reflection modes
#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)]
pub enum ReflectionMode {
/// No or minimal reflections.
Low,
/// High quality reflections with screen-space raycasting and
/// all the bells & whistles.
High,
// Medium quality screen-space reflections.
#[serde(other)]
Medium,
}
impl Default for ReflectionMode {
fn default() -> Self { ReflectionMode::Medium }
}
/// Lighting modes /// Lighting modes
#[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] #[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)]
pub enum LightingMode { pub enum LightingMode {
@ -359,6 +376,7 @@ impl BloomMode {
pub struct RenderMode { pub struct RenderMode {
pub aa: AaMode, pub aa: AaMode,
pub cloud: CloudMode, pub cloud: CloudMode,
pub reflection: ReflectionMode,
pub fluid: FluidMode, pub fluid: FluidMode,
pub lighting: LightingMode, pub lighting: LightingMode,
pub shadow: ShadowMode, pub shadow: ShadowMode,
@ -382,6 +400,7 @@ impl Default for RenderMode {
aa: AaMode::default(), aa: AaMode::default(),
cloud: CloudMode::default(), cloud: CloudMode::default(),
fluid: FluidMode::default(), fluid: FluidMode::default(),
reflection: ReflectionMode::default(),
lighting: LightingMode::default(), lighting: LightingMode::default(),
shadow: ShadowMode::default(), shadow: ShadowMode::default(),
rain_occlusion: ShadowMapMode::default(), rain_occlusion: ShadowMapMode::default(),
@ -403,6 +422,7 @@ impl RenderMode {
aa: self.aa, aa: self.aa,
cloud: self.cloud, cloud: self.cloud,
fluid: self.fluid, fluid: self.fluid,
reflection: self.reflection,
lighting: self.lighting, lighting: self.lighting,
shadow: self.shadow, shadow: self.shadow,
rain_occlusion: self.rain_occlusion, rain_occlusion: self.rain_occlusion,
@ -427,6 +447,7 @@ pub struct PipelineModes {
aa: AaMode, aa: AaMode,
pub cloud: CloudMode, pub cloud: CloudMode,
fluid: FluidMode, fluid: FluidMode,
reflection: ReflectionMode,
lighting: LightingMode, lighting: LightingMode,
pub shadow: ShadowMode, pub shadow: ShadowMode,
pub rain_occlusion: ShadowMapMode, pub rain_occlusion: ShadowMapMode,
@ -498,15 +519,6 @@ pub enum ExperimentalShader {
DirectionalShadowMapTexelGrid, DirectionalShadowMapTexelGrid,
/// Disable rainbows /// Disable rainbows
NoRainbows, NoRainbows,
/// Make the ground appear wet when appropriate. /// Add extra detailing to puddles.
Puddles,
/// Add extra detailing to puddles (requires [`Puddles`]).
PuddleDetails, PuddleDetails,
/// Add screen-space reflections to water.
ScreenSpaceReflections,
/// Use screen-space raycasting for reflections (requires
/// [`ScreenSpaceReflections`]).
ScreenSpaceReflectionsCasting,
/// Add screen-space refractions to water.
ScreenSpaceRefraction,
} }

View File

@ -6,8 +6,8 @@ use super::{
blit, bloom, clouds, debug, figure, fluid, lod_object, lod_terrain, particle, blit, bloom, clouds, debug, figure, fluid, lod_object, lod_terrain, particle,
postprocess, shadow, skybox, sprite, terrain, trail, ui, postprocess, shadow, skybox, sprite, terrain, trail, ui,
}, },
AaMode, BloomMode, CloudMode, FluidMode, LightingMode, PipelineModes, RenderError, AaMode, BloomMode, CloudMode, FluidMode, LightingMode, PipelineModes, ReflectionMode,
ShadowMode, RenderError, ShadowMode,
}, },
shaders::Shaders, shaders::Shaders,
ImmutableLayouts, Layouts, ImmutableLayouts, Layouts,
@ -173,6 +173,7 @@ impl ShaderModules {
#define VOXYGEN_COMPUTATION_PREFERENCE {} #define VOXYGEN_COMPUTATION_PREFERENCE {}
#define FLUID_MODE {} #define FLUID_MODE {}
#define CLOUD_MODE {} #define CLOUD_MODE {}
#define REFLECTION_MODE {}
#define LIGHTING_ALGORITHM {} #define LIGHTING_ALGORITHM {}
#define SHADOW_MODE {} #define SHADOW_MODE {}
@ -181,7 +182,7 @@ impl ShaderModules {
// TODO: Configurable vertex/fragment shader preference. // TODO: Configurable vertex/fragment shader preference.
"VOXYGEN_COMPUTATION_PREFERENCE_FRAGMENT", "VOXYGEN_COMPUTATION_PREFERENCE_FRAGMENT",
match pipeline_modes.fluid { match pipeline_modes.fluid {
FluidMode::Cheap => "FLUID_MODE_CHEAP", FluidMode::Low => "FLUID_MODE_LOW",
FluidMode::Medium => "FLUID_MODE_MEDIUM", FluidMode::Medium => "FLUID_MODE_MEDIUM",
FluidMode::High => "FLUID_MODE_HIGH", FluidMode::High => "FLUID_MODE_HIGH",
}, },
@ -193,6 +194,11 @@ impl ShaderModules {
CloudMode::High => "CLOUD_MODE_HIGH", CloudMode::High => "CLOUD_MODE_HIGH",
CloudMode::Ultra => "CLOUD_MODE_ULTRA", CloudMode::Ultra => "CLOUD_MODE_ULTRA",
}, },
match pipeline_modes.reflection {
ReflectionMode::Low => "REFLECTION_MODE_LOW",
ReflectionMode::Medium => "REFLECTION_MODE_MEDIUM",
ReflectionMode::High => "REFLECTION_MODE_HIGH",
},
match pipeline_modes.lighting { match pipeline_modes.lighting {
LightingMode::Ashikhmin => "LIGHTING_ALGORITHM_ASHIKHMIN", LightingMode::Ashikhmin => "LIGHTING_ALGORITHM_ASHIKHMIN",
LightingMode::BlinnPhong => "LIGHTING_ALGORITHM_BLINN_PHONG", LightingMode::BlinnPhong => "LIGHTING_ALGORITHM_BLINN_PHONG",
@ -299,7 +305,7 @@ impl ShaderModules {
}; };
let selected_fluid_shader = ["fluid-frag.", match pipeline_modes.fluid { let selected_fluid_shader = ["fluid-frag.", match pipeline_modes.fluid {
FluidMode::Cheap => "cheap", FluidMode::Low => "cheap",
_ => "shiny", _ => "shiny",
}] }]
.concat(); .concat();