From 2f86030aad68031072b98be48110a24cb544b053 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 19 Jan 2022 22:58:12 +0100 Subject: [PATCH] Fragment shader optimizations --- deps/dragontype | 2 +- shaders/3d/fragment.glsl | 17 +++-------------- shaders/3d/vertex.glsl | 8 ++++++++ src/client/scene.c | 10 +++++++++- src/client/scene.h | 2 ++ src/server/biomes.c | 11 +++-------- src/server/voxelctx.c | 13 ++++--------- 7 files changed, 30 insertions(+), 33 deletions(-) diff --git a/deps/dragontype b/deps/dragontype index c4d3a0b..b3c245b 160000 --- a/deps/dragontype +++ b/deps/dragontype @@ -1 +1 @@ -Subproject commit c4d3a0bff0c158ad0efee031a531eb920d904d14 +Subproject commit b3c245ba9b111462f2fff6178b08b486cd553f1b diff --git a/shaders/3d/fragment.glsl b/shaders/3d/fragment.glsl index dcfb212..653d579 100755 --- a/shaders/3d/fragment.glsl +++ b/shaders/3d/fragment.glsl @@ -6,25 +6,14 @@ in vec3 fragmentColor; out vec4 outColor; -uniform float daylight; -uniform vec3 lightDir; +uniform vec3 fogColor; uniform vec3 cameraPos; uniform sampler2D textures[MAX_TEXTURE_UNITS]; void main() { - vec3 lightColor = vec3(1.0); - vec3 fogColor = mix(vec3(0x03, 0x0A, 0x1A), vec3(0x87, 0xCE, 0xEB), daylight) / vec3(0xFF); - - float ambientStrength = mix(0.3, 0.7, daylight); - - vec3 ambient = ambientStrength * lightColor; - vec3 diffuse = 0.3 * daylight * clamp(dot(normalize(fragmentNormal), normalize(lightDir)), 0.0, 1.0) * lightColor; - - vec3 light = ambient + diffuse; - - outColor = texture(textures[int(fragmentTextureIndex + 0.5)], fragmentTextureCoords) * vec4(fragmentColor, 1.0) * vec4(light, 1.0); - outColor.rgb = mix(outColor.rgb, ambientStrength * fogColor, clamp(length(fragmentPosition - cameraPos) / 255.0, 0.0, 1.0)); + outColor = texture(textures[int(fragmentTextureIndex + 0.5)], fragmentTextureCoords) * vec4(fragmentColor, 1.0); + outColor.rgb = mix(outColor.rgb, fogColor, clamp(length(fragmentPosition - cameraPos) / 255.0, 0.0, 1.0)); if (outColor.a == 0.0) discard; diff --git a/shaders/3d/vertex.glsl b/shaders/3d/vertex.glsl index bb991ae..8d48d53 100755 --- a/shaders/3d/vertex.glsl +++ b/shaders/3d/vertex.glsl @@ -12,6 +12,9 @@ out vec3 fragmentColor; uniform mat4 model; uniform mat4 VP; +uniform float daylight; +uniform float ambientLight; +uniform vec3 lightDir; void main() { @@ -23,4 +26,9 @@ void main() fragmentTextureIndex = vertexTextureIndex; fragmentTextureCoords = vertexTextureCoords; fragmentColor = vertexColor; + + float diffuseLight = 0.3 * daylight * clamp(dot(normalize(fragmentNormal), normalize(lightDir)), 0.0, 1.0); + float light = ambientLight + diffuseLight; + + fragmentColor *= light; } diff --git a/src/client/scene.c b/src/client/scene.c index d560c74..93a5699 100644 --- a/src/client/scene.c +++ b/src/client/scene.c @@ -35,6 +35,8 @@ bool scene_init() scene.loc_model = glGetUniformLocation(scene.prog, "model"); scene.loc_VP = glGetUniformLocation(scene.prog, "VP"); scene.loc_daylight = glGetUniformLocation(scene.prog, "daylight"); + scene.loc_fogColor = glGetUniformLocation(scene.prog, "fogColor"); + scene.loc_ambientLight = glGetUniformLocation(scene.prog, "ambientLight"); scene.loc_lightDir = glGetUniformLocation(scene.prog, "lightDir"); scene.loc_cameraPos = glGetUniformLocation(scene.prog, "cameraPos"); @@ -88,11 +90,17 @@ void scene_render(f64 dtime) frustum_update(scene.VP); + f32 daylight = get_daylight(); + f32 ambient_light = f32_mix(0.3f, 0.7f, daylight); + v3f32 fog_color = v3f32_mix((v3f32) {0x03, 0x0A, 0x1A}, (v3f32) {0x87, 0xCE, 0xEB}, daylight); + glUseProgram(scene.prog); glUniformMatrix4fv(scene.loc_VP, 1, GL_FALSE, scene.VP[0]); glUniform3f(scene.loc_lightDir, sunlight_dir[0], sunlight_dir[1], sunlight_dir[2]); glUniform3f(scene.loc_cameraPos, camera.eye[0], camera.eye[1], camera.eye[2]); - glUniform1f(scene.loc_daylight, get_daylight()); + glUniform1f(scene.loc_daylight, daylight); + glUniform3f(scene.loc_fogColor, fog_color.x / 0xFF * ambient_light, fog_color.y / 0xFF * ambient_light, fog_color.z / 0xFF * ambient_light); + glUniform1f(scene.loc_ambientLight, ambient_light); for (ListPair **pairptr = &scene.objects.first; *pairptr != NULL; ) { ListPair *pair = *pairptr; diff --git a/src/client/scene.h b/src/client/scene.h index 2941db0..bb8fd20 100644 --- a/src/client/scene.h +++ b/src/client/scene.h @@ -18,6 +18,8 @@ extern struct Scene GLint loc_model; GLint loc_VP; GLint loc_daylight; + GLint loc_fogColor; + GLint loc_ambientLight; GLint loc_lightDir; GLint loc_cameraPos; GLint max_texture_units; diff --git a/src/server/biomes.c b/src/server/biomes.c index 082c85c..4a7834a 100644 --- a/src/server/biomes.c +++ b/src/server/biomes.c @@ -122,11 +122,6 @@ static bool find_near_vulcano(v2s32 pos, v2s32 *result) return false; } -static f64 mix(f64 a, f64 b, f64 f) -{ - return (a * (1.0 - f) + b * f); -} - static inline f64 min(f64 a, f64 b) { return a < b ? a : b; @@ -146,16 +141,16 @@ static s32 calculate_ocean_floor(f64 factor, s32 height) { switch (get_ocean_level(factor)) { case OL_BEACH_EDGE: - return mix(height + 1, 0, pow(get_ocean_level_factor(factor, OL_BEACH_EDGE), 0.8)); + return f64_mix(height + 1, 0, pow(get_ocean_level_factor(factor, OL_BEACH_EDGE), 0.8)); case OL_BEACH: return 0; case OL_OCEAN: - return mix(0, -10, pow(get_ocean_level_factor(factor, OL_OCEAN), 0.5)); + return f64_mix(0, -10, pow(get_ocean_level_factor(factor, OL_OCEAN), 0.5)); case OL_DEEP_OCEAN: - return mix(-10, -50, pow(get_ocean_level_factor(factor, OL_DEEP_OCEAN), 0.5)); + return f64_mix(-10, -50, pow(get_ocean_level_factor(factor, OL_DEEP_OCEAN), 0.5)); default: break; diff --git a/src/server/voxelctx.c b/src/server/voxelctx.c index 59b3251..5023f09 100644 --- a/src/server/voxelctx.c +++ b/src/server/voxelctx.c @@ -57,16 +57,11 @@ void voxelctx_delete(Voxelctx *ctx) free(ctx); } -static inline f32 mix(f32 x, f32 y, f32 t) -{ - return (1.0 - t) * x + t * y; -} - static void move_value(f32 *x, f32 v, f32 range) { f32 dst = v >= 0 ? range : 0; v = fabs(v); - *x = mix(*x, dst, v); + *x = f32_mix(*x, dst, v); } void voxelctx_hue(Voxelctx *ctx, f32 value) @@ -227,9 +222,9 @@ void voxelctx_cube(Voxelctx *ctx, Node node, bool use_color) for (int i = 0; i < 3; i++) { f32 f = trunc( - + mix(corners[0][i], corners[4][i], (f32) x / (f32) max_len / 2.0f) - + mix(corners[0][i], corners[2][i], (f32) y / (f32) max_len / 2.0f) - + mix(corners[0][i], corners[1][i], (f32) z / (f32) max_len / 2.0f)); + + f32_mix(corners[0][i], corners[4][i], (f32) x / (f32) max_len / 2.0f) + + f32_mix(corners[0][i], corners[2][i], (f32) y / (f32) max_len / 2.0f) + + f32_mix(corners[0][i], corners[1][i], (f32) z / (f32) max_len / 2.0f)); v[i] = floor(VOXELCTXSTATE(ctx).pos[i] + f + 0.5f); } -- 2.44.0