From 6d61b17c4289185d59d37caae8070a40e91fba40 Mon Sep 17 00:00:00 2001 From: Mel Date: Thu, 29 Jun 2023 22:54:17 +0200 Subject: Add fog --- assets/shaders/fragment.glsl | 4 +++- assets/shaders/vertex.glsl | 9 +++++++-- src/main.cpp | 8 ++++++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/assets/shaders/fragment.glsl b/assets/shaders/fragment.glsl index eca50d9..71435ef 100644 --- a/assets/shaders/fragment.glsl +++ b/assets/shaders/fragment.glsl @@ -2,9 +2,11 @@ uniform sampler2D tex; uniform vec3 sun_direction; +uniform vec3 sky_color; in vec3 surface_normal; in vec2 frag_tex_coord; +in float depth; out vec4 color; @@ -13,5 +15,5 @@ void main() { vec3 diffuse = vec3(max(brightness, 0.3)); color = vec4(diffuse, 1.0) * texture(tex, frag_tex_coord); - // color = texture(tex, frag_tex_coord); + color = mix(vec4(sky_color, 1.0), color, 1 - depth); } \ No newline at end of file diff --git a/assets/shaders/vertex.glsl b/assets/shaders/vertex.glsl index c59d6cd..3ca1055 100644 --- a/assets/shaders/vertex.glsl +++ b/assets/shaders/vertex.glsl @@ -10,10 +10,15 @@ layout (location = 2) in vec2 tex_coord; out vec2 frag_tex_coord; out vec3 surface_normal; +out float depth; void main() { - gl_Position = projection_matrix * view_matrix * model_matrix * vec4(position, 1.0); - frag_tex_coord = tex_coord; + vec4 world_position = model_matrix * vec4(position, 1.0); + vec4 view_position = view_matrix * world_position; + vec4 clip_position = projection_matrix * view_position; + gl_Position = clip_position; + frag_tex_coord = tex_coord; surface_normal = (model_matrix * vec4(normal, 0.0)).xyz; + depth = clamp((length(view_position) - 75) / 125, 0.0, 1.0); } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index b407a78..b0939c1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,7 +55,7 @@ void run() { MC::World::World world; MC::GFX::Camera camera{}; - camera.set_position({0.0f, 50.0f, 0.0f}); + camera.set_position({0.0f, MC::World::Chunk::Height / 2.0f, 0.0f}); MC::GFX::Shading::Program program( MC::GFX::Shading::Shader::create_vertex(), @@ -66,6 +66,7 @@ void run() { auto view_uniform = program.uniform("view_matrix"); auto projection_uniform = program.uniform("projection_matrix"); auto sun_direction_uniform = program.uniform("sun_direction"); + auto sky_color_uniform = program.uniform("sky_color"); program.bind(); auto projection = Math::MVP::perspective_projection(ASPECT, FOV, 0.1f, 1000.0f); @@ -74,6 +75,9 @@ void run() { Vector<3> sun_direction{1.0f, -1.0f, 0.0f}; sun_direction_uniform.set(sun_direction); + Vector<3> sky_color{0.85f, 0.85f, 0.85f}; // #DBDBDB + sky_color_uniform.set(sky_color); + glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); @@ -96,7 +100,7 @@ void run() { auto view = Math::MVP::view(camera.position(), camera.angles()); view_uniform.set(view); - glClearColor(0.85f, 0.85f, 0.85f, 1.0f); // #DBDBDB + glClearColor(sky_color.x(), sky_color.y(), sky_color.z(), 1.0f); // #DBDBDB glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for (auto& chunk : world.get_visible_chunks(camera.position())) { auto model = Math::MVP::model(chunk.chunk.value().position(), {}); -- cgit 1.4.1