From: Brendan Hansen Date: Mon, 17 Jan 2022 16:23:46 +0000 (-0600) Subject: added fog X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=b808e1531c3f211e83843ee107f60576c803aec3;p=voxel-shooter.git added fog --- diff --git a/run_tree/assets/shaders/world_fragment.glsl b/run_tree/assets/shaders/world_fragment.glsl index f54d2ff..dc1ff92 100644 --- a/run_tree/assets/shaders/world_fragment.glsl +++ b/run_tree/assets/shaders/world_fragment.glsl @@ -3,11 +3,22 @@ precision mediump float; uniform sampler2D u_sampler; +uniform vec3 u_fog_color; +uniform float u_fog_start; +uniform float u_fog_range; + + in vec4 v_color; in vec2 v_tex; in float v_tex_enabled; +in float v_dist; out vec4 fragColor; void main() { - fragColor = vec4((v_color * mix(vec4(1), texture(u_sampler, v_tex), v_tex_enabled)).xyz, 1); + vec4 tile_color = vec4((v_color * mix(vec4(1), texture(u_sampler, v_tex), v_tex_enabled)).xyz, 1); + + // Not going to rely on clamp() existing. + float fog = min(1.0f, max(0.0f, (v_dist - u_fog_start) / u_fog_range)); + + fragColor = mix(tile_color, vec4(u_fog_color, 1), fog); } diff --git a/run_tree/assets/shaders/world_vertex.glsl b/run_tree/assets/shaders/world_vertex.glsl index 5e53074..ff7709c 100644 --- a/run_tree/assets/shaders/world_vertex.glsl +++ b/run_tree/assets/shaders/world_vertex.glsl @@ -12,9 +12,12 @@ layout(std140) uniform u_world_matrix_block { out vec4 v_color; out vec2 v_tex; out float v_tex_enabled; +out float v_dist; void main() { - gl_Position = u_view * u_world * u_model * vec4(a_pos, 1); + vec4 pos = u_world * u_model * vec4(a_pos, 1); + v_dist = length(pos); + gl_Position = u_view * pos; vec3 block_color = vec3( float((a_data & 0x0000FU) >> 0U) / 15.0, diff --git a/src/main.onyx b/src/main.onyx index 719204c..03ac7d9 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -94,6 +94,8 @@ setup_opengl :: () { "assets/shaders/world_fragment.glsl"); shader_link_world_matrix_block(world_shader); + shader_set_uniform(world_shader, #cstr "u_fog_start", 40.0f); + shader_set_uniform(world_shader, #cstr "u_fog_range", 5.0f); font = font_lookup(.{"./assets/fonts/calibri.ttf", 32}); @@ -148,6 +150,7 @@ draw :: () { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shader_use(world_shader); + shader_set_uniform(world_shader, #cstr "u_fog_color", Vector3.{ 0.7, 0.7, 0.9 }); shader_set_uniform(world_shader, #cstr "u_texture", 0); world_draw(world); @@ -165,7 +168,8 @@ draw :: () { font_print(font, 0, 96, "Facing: {}", camera.y_rot * 180 / math.PI); font_print(font, 0, 128, "Looking at: {}", selected_block); font_print(font, 0, 160, "Chunk: {}", player_chunk); - font_print(font, 0, 192, "Chunks loading: {}", world.chunks_to_load.count); + // font_print(font, 0, 192, "Chunks loading: {}", world.chunks_to_load.count); + font_print(font, 0, 192, "Heap: {.2}MB Freed: {.2}MB\n", cast(f32) alloc.heap.get_watermark() / (1024 * 1024), cast(f32) alloc.heap.get_freed_size() / (1024 * 1024)); } glfwSwapBuffers(window); diff --git a/src/shader.onyx b/src/shader.onyx index b7118e4..e5fdca6 100644 --- a/src/shader.onyx +++ b/src/shader.onyx @@ -60,9 +60,17 @@ shader_set_uniform :: (shader: Shader, uniform: cstr, value: $T) { glUseProgram(shader.prog); location := glGetUniformLocation(shader.prog, uniform); - switch T { - case i32, u32 do glUniform1i(location, value); - case #default do assert(false, "Bad case."); + set_uniform_internal(location, value); + + set_uniform_internal :: #match { + macro (location: GLint, value: u32) do glUniform1i(location, value); , + macro (location: GLint, value: f32) do glUniform1f(location, value); , + macro (location: GLint, value: Vector3) do glUniform3f(location, value.x, value.y, value.z); , + + macro (location: GLint, value: $T) { + buffer: [1024] u8; + assert(false, conv.format(buffer, "Bad shader_set_uniform case: {}", T)); + } } } diff --git a/src/worldgen.onyx b/src/worldgen.onyx index 1df745a..038b5ef 100644 --- a/src/worldgen.onyx +++ b/src/worldgen.onyx @@ -2,7 +2,7 @@ use package core #local perlin :: package perlin -#local seed :: 1234 +#local seed :: 8675309 generate_chunk :: (world: ^World, chunk: ^Chunk) { for cz: 32 do for cx: 32 {