From 0c8e09299fec0eaff86c01e4f62fead8d9888c83 Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Sun, 19 Jan 2025 23:52:43 -0500 Subject: [PATCH 1/9] basic skybox --- .../shaders/chunks/transparent_fragment.fs | 3 + assets/cubyz/shaders/deferred_render_pass.fs | 13 ++- assets/cubyz/shaders/skybox/fragment.fs | 9 ++ assets/cubyz/shaders/skybox/vertex.vs | 14 +++ src/renderer.zig | 91 +++++++++++++++++++ 5 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 assets/cubyz/shaders/skybox/fragment.fs create mode 100644 assets/cubyz/shaders/skybox/vertex.vs diff --git a/assets/cubyz/shaders/chunks/transparent_fragment.fs b/assets/cubyz/shaders/chunks/transparent_fragment.fs index 5ae364bc9..697d97b6a 100644 --- a/assets/cubyz/shaders/chunks/transparent_fragment.fs +++ b/assets/cubyz/shaders/chunks/transparent_fragment.fs @@ -67,6 +67,9 @@ float zFromDepth(float depthBufferValue) { } float calculateFogDistance(float dist, float fogDensity) { + if (texelFetch(depthTexture, ivec2(gl_FragCoord.xy), 0).r == 1) { // No fog if it is a skybox + return 0; + } float distCameraTerrain = dist*fogDensity; float distFromCamera = abs(mvVertexPos.y)*fogDensity; float distFromTerrain = distFromCamera - distCameraTerrain; diff --git a/assets/cubyz/shaders/deferred_render_pass.fs b/assets/cubyz/shaders/deferred_render_pass.fs index 6441f5c66..098059774 100644 --- a/assets/cubyz/shaders/deferred_render_pass.fs +++ b/assets/cubyz/shaders/deferred_render_pass.fs @@ -23,6 +23,9 @@ float zFromDepth(float depthBufferValue) { } float calculateFogDistance(float depthBufferValue, float fogDensity) { + if (depthBufferValue == 1) { + return 0; + } float distCameraTerrain = zFromDepth(depthBufferValue)*fogDensity; float distFromCamera = 0; float distFromTerrain = distFromCamera - distCameraTerrain; @@ -53,9 +56,13 @@ vec3 applyFrontfaceFog(float fogDistance, vec3 fogColor, vec3 inColor) { void main() { fragColor = texture(color, texCoords); fragColor += texture(bloomColor, texCoords); - float densityAdjustment = sqrt(dot(tanXY*(texCoords*2 - 1), tanXY*(texCoords*2 - 1)) + 1); - float fogDistance = calculateFogDistance(texture(depthTexture, texCoords).r, fog.density*densityAdjustment); - fragColor.rgb = applyFrontfaceFog(fogDistance, fog.color, fragColor.rgb); + + // if (texture(depthTexture, texCoords).r != 1) { // Don't calculate fog for the skybox + float densityAdjustment = sqrt(dot(tanXY*(texCoords*2 - 1), tanXY*(texCoords*2 - 1)) + 1); + float fogDistance = calculateFogDistance(texture(depthTexture, texCoords).r, fog.density*densityAdjustment); + fragColor.rgb = applyFrontfaceFog(fogDistance, fog.color, fragColor.rgb); + // } + float maxColor = max(1.0, max(fragColor.r, max(fragColor.g, fragColor.b))); fragColor.rgb = fragColor.rgb/maxColor; } \ No newline at end of file diff --git a/assets/cubyz/shaders/skybox/fragment.fs b/assets/cubyz/shaders/skybox/fragment.fs new file mode 100644 index 000000000..ffc8bf0c5 --- /dev/null +++ b/assets/cubyz/shaders/skybox/fragment.fs @@ -0,0 +1,9 @@ +#version 330 + +layout (location=0) out vec4 fragColor; + +in vec3 pos; + +void main() { + fragColor = vec4(normalize(pos), 1); +} \ No newline at end of file diff --git a/assets/cubyz/shaders/skybox/vertex.vs b/assets/cubyz/shaders/skybox/vertex.vs new file mode 100644 index 000000000..99927c635 --- /dev/null +++ b/assets/cubyz/shaders/skybox/vertex.vs @@ -0,0 +1,14 @@ +#version 330 + +layout (location=0) in vec3 vertexPos; + +out vec3 pos; + +uniform mat4 viewMatrix; +uniform mat4 projectionMatrix; + +void main() { + gl_Position = projectionMatrix*viewMatrix*vec4(vertexPos, 1); + + pos = vertexPos; +} \ No newline at end of file diff --git a/src/renderer.zig b/src/renderer.zig index 9e139fa1c..202e98fa8 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -60,6 +60,7 @@ var reflectionCubeMap: graphics.CubeMapTexture = undefined; pub fn init() void { deferredRenderPassShader = Shader.initAndGetUniforms("assets/cubyz/shaders/deferred_render_pass.vs", "assets/cubyz/shaders/deferred_render_pass.fs", "", &deferredUniforms); fakeReflectionShader = Shader.initAndGetUniforms("assets/cubyz/shaders/fake_reflection.vs", "assets/cubyz/shaders/fake_reflection.fs", "", &fakeReflectionUniforms); + worldFrameBuffer.init(true, c.GL_NEAREST, c.GL_CLAMP_TO_EDGE); worldFrameBuffer.updateSize(Window.width, Window.height, c.GL_RGB16F); Bloom.init(); @@ -67,6 +68,7 @@ pub fn init() void { MenuBackGround.init() catch |err| { std.log.err("Failed to initialize the Menu Background: {s}", .{@errorName(err)}); }; + Skybox.init(); chunk_meshing.init(); mesh_storage.init(); reflectionCubeMap = .init(); @@ -81,6 +83,7 @@ pub fn deinit() void { Bloom.deinit(); MeshSelection.deinit(); MenuBackGround.deinit(); + Skybox.deinit(); mesh_storage.deinit(); chunk_meshing.deinit(); reflectionCubeMap.deinit(); @@ -177,6 +180,8 @@ pub fn renderWorld(world: *World, ambientLight: Vec3f, skyColor: Vec3f, playerPo const time: u32 = @intCast(std.time.milliTimestamp() & std.math.maxInt(u32)); + Skybox.render(); + gpu_performance_measuring.startQuery(.animation); blocks.meshes.preProcessAnimationData(time); gpu_performance_measuring.stopQuery(); @@ -581,6 +586,92 @@ pub const MenuBackGround = struct { } }; +pub const Skybox = struct { + var shader: Shader = undefined; + var uniforms: struct { + time: c_int, + sunPos: c_int, + viewMatrix: c_int, + projectionMatrix: c_int, + } = undefined; + + var vao: c_uint = undefined; + var vbos: [2]c_uint = undefined; + + var lastTime: i128 = undefined; + var time: f32 = 0; + + fn init() void { + lastTime = std.time.nanoTimestamp(); + shader = Shader.initAndGetUniforms("assets/cubyz/shaders/skybox/vertex.vs", "assets/cubyz/shaders/skybox/fragment.fs", "", &uniforms); + shader.bind(); + // 4 sides of a simple cube with some panorama texture on it. + const rawData = [_]f32 { + -1, -1, -1, + 1, -1, -1, + 1, 1, -1, + -1, 1, -1, + -1, -1, 1, + 1, -1, 1, + 1, 1, 1, + -1, 1, 1 + }; + + const indices = [_]c_int { + 0, 3, 1, 1, 3, 2, + 5, 6, 4, 4, 6, 7, + 3, 7, 2, 2, 7, 6, + 1, 5, 0, 0, 5, 4, + 4, 7, 0, 0, 7, 3, + 1, 2, 5, 5, 2, 6, + }; + + c.glGenVertexArrays(1, &vao); + c.glBindVertexArray(vao); + c.glGenBuffers(2, &vbos); + c.glBindBuffer(c.GL_ARRAY_BUFFER, vbos[0]); + c.glBufferData(c.GL_ARRAY_BUFFER, @intCast(rawData.len*@sizeOf(f32)), &rawData, c.GL_STATIC_DRAW); + c.glVertexAttribPointer(0, 3, c.GL_FLOAT, c.GL_FALSE, 3*@sizeOf(f32), null); + c.glEnableVertexAttribArray(0); + c.glBindBuffer(c.GL_ELEMENT_ARRAY_BUFFER, vbos[1]); + c.glBufferData(c.GL_ELEMENT_ARRAY_BUFFER, @intCast(indices.len*@sizeOf(c_int)), &indices, c.GL_STATIC_DRAW); + } + + pub fn deinit() void { + shader.deinit(); + c.glDeleteVertexArrays(1, &vao); + c.glDeleteBuffers(2, &vbos); + } + + pub fn render() void { + c.glDisable(c.GL_CULL_FACE); + c.glDisable(c.GL_DEPTH_TEST); + + const viewMatrix = game.camera.viewMatrix; + shader.bind(); + + const newTime = std.time.nanoTimestamp(); + time += @as(f32, @floatFromInt(newTime - lastTime))/1e9; + lastTime = newTime; + + var sunPos = Vec3f {1, 0, 0}; + sunPos = vec.rotateZ(sunPos, time * std.math.pi * 2); + sunPos = vec.rotateX(sunPos, 60 * std.math.rad_per_deg); + + c.glUniform1f(uniforms.time, time); + c.glUniform3fv(uniforms.sunPos, 1, @ptrCast(&sunPos)); + + c.glUniformMatrix4fv(uniforms.viewMatrix, 1, c.GL_TRUE, @ptrCast(&viewMatrix)); + c.glUniformMatrix4fv(uniforms.projectionMatrix, 1, c.GL_TRUE, @ptrCast(&game.projectionMatrix)); + + c.glBindVertexArray(vao); + c.glDrawElements(c.GL_TRIANGLES, 36, c.GL_UNSIGNED_INT, null); + + c.glEnable(c.GL_CULL_FACE); + c.glEnable(c.GL_DEPTH_TEST); + } +}; + pub const Frustum = struct { // MARK: Frustum const Plane = struct { pos: Vec3f, From 6b3d6071a4b3ea1a3d5b8be32ab6058f64d31b5f Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Mon, 20 Jan 2025 02:38:38 -0500 Subject: [PATCH 2/9] make it synced with the time --- assets/cubyz/shaders/skybox/fragment.fs | 170 +++++++++++++++++++++++- src/game.zig | 2 +- src/renderer.zig | 26 ++-- 3 files changed, 182 insertions(+), 16 deletions(-) diff --git a/assets/cubyz/shaders/skybox/fragment.fs b/assets/cubyz/shaders/skybox/fragment.fs index ffc8bf0c5..17a62fc97 100644 --- a/assets/cubyz/shaders/skybox/fragment.fs +++ b/assets/cubyz/shaders/skybox/fragment.fs @@ -4,6 +4,174 @@ layout (location=0) out vec4 fragColor; in vec3 pos; +#define PI 3.141592 +#define iSteps 16 +#define jSteps 8 +#define ATMOS_SIZE 6371e3 + +uniform mat4 lightDir; +uniform mat4 invLightDir; +uniform float altitude; + +vec2 rsi(vec3 r0, vec3 rd, float sr) { + float a = dot(rd, rd); + float b = 2.0 * dot(rd, r0); + float c = dot(r0, r0) - (sr * sr); + float d = (b*b) - 4.0*a*c; + if (d < 0.0) return vec2(1e5,-1e5); + return vec2( + (-b - sqrt(d))/(2.0*a), + (-b + sqrt(d))/(2.0*a) + ); +} + +vec3 atmosphere(vec3 r, vec3 r0, vec3 pSun, float iSun, float rPlanet, float rAtmos, vec3 kRlh, float kMie, float shRlh, float shMie, float g) { + pSun = normalize(pSun); + r = normalize(r); + + vec2 p = rsi(r0, r, rAtmos); + if (p.x > p.y) return vec3(0,0,0); + p.y = min(p.y, rsi(r0, r, rPlanet).x); + float iStepSize = (p.y - p.x) / float(iSteps); + + float iTime = 0.0; + + vec3 totalRlh = vec3(0,0,0); + vec3 totalMie = vec3(0,0,0); + + float iOdRlh = 0.0; + float iOdMie = 0.0; + + float mu = dot(r, pSun); + float mumu = mu * mu; + float gg = g * g; + float pRlh = 3.0 / (16.0 * PI) * (1.0 + mumu); + float pMie = 3.0 / (8.0 * PI) * ((1.0 - gg) * (mumu + 1.0)) / (pow(1.0 + gg - 2.0 * mu * g, 1.5) * (2.0 + gg)); + + for (int i = 0; i < iSteps; i++) { + + vec3 iPos = r0 + r * (iTime + iStepSize * 0.5); + + float iHeight = length(iPos) - rPlanet; + + float odStepRlh = exp(-iHeight / shRlh) * iStepSize; + float odStepMie = exp(-iHeight / shMie) * iStepSize; + + iOdRlh += odStepRlh; + iOdMie += odStepMie; + + float jStepSize = rsi(iPos, pSun, rAtmos).y / float(jSteps); + + float jTime = 0.0; + + float jOdRlh = 0.0; + float jOdMie = 0.0; + + for (int j = 0; j < jSteps; j++) { + + vec3 jPos = iPos + pSun * (jTime + jStepSize * 0.5); + + float jHeight = length(jPos) - rPlanet; + + jOdRlh += exp(-jHeight / shRlh) * jStepSize; + jOdMie += exp(-jHeight / shMie) * jStepSize; + + jTime += jStepSize; + } + + vec3 attn = exp(-(kMie * (iOdMie + jOdMie) + kRlh * (iOdRlh + jOdRlh))); + + totalRlh += odStepRlh * attn; + totalMie += odStepMie * attn; + + iTime += iStepSize; + + } + + return iSun * (pRlh * kRlh * totalRlh + pMie * kMie * totalMie); +} + +vec3 hash( vec3 x ) +{ + x = vec3( dot(x,vec3(127.1,311.7, 74.7)), + dot(x,vec3(269.5,183.3,246.1)), + dot(x,vec3(113.5,271.9,124.6))); + + return fract(sin(x)*43758.5453123); +} + +vec3 voronoi_sphere( in vec3 x ) +{ + vec3 p = floor( x ); + vec3 f = fract( x ); + + float sphere_radius = length(x); + + float id = 0.0; + vec2 res = vec2( 100.0 ); + for( int k=-1; k<=1; k++ ) + for( int j=-1; j<=1; j++ ) + for( int i=-1; i<=1; i++ ) + { + vec3 b = vec3( float(i), float(j), float(k) ); + vec3 r = vec3( b ) - f + hash( p + b ); + + vec3 cell_center_in_os = p + b + vec3(0.5); + float dist_between_cell_center_and_sphere_surface = abs(length(cell_center_in_os) - sphere_radius); + + float max_cell_dist = 0.5; + if (dist_between_cell_center_and_sphere_surface < max_cell_dist) + { + + vec3 r_in_os = x + r; + r_in_os = normalize(r_in_os) * sphere_radius; + r = r_in_os - x; + + float d = dot( r, r ); + if( d < res.x ) + { + id = dot( p+b, vec3(1.0,57.0,113.0 ) ); + res = vec2( d, res.x ); + } + else if( d < res.y ) + { + res.y = d; + } + } + } + + return vec3( sqrt( res ), abs(id) ); +} + void main() { - fragColor = vec4(normalize(pos), 1); + vec3 rayDir = normalize(pos); + + vec3 sunDir = (lightDir * vec4(1, 0, 0, 1)).xyz; + + vec3 color = atmosphere( + rayDir, + vec3(0,0,6372e3 + altitude), + sunDir, + 22.0, + 6371e3, + 6471e3, + vec3(5.5e-6, 13.0e-6, 22.4e-6), + 21e-6, + 8e3, + 1.2e3, + 0.758 + ); + + color += smoothstep(0.998, 0.999, dot(rayDir, sunDir)) * 20; + + fragColor = vec4(color, 1); + + float brightness = dot(color, vec3(0.2126, 0.7152, 0.0722)); + if (brightness < 0.02) { + vec3 starColor = vec3(smoothstep(0.07, 0.05, voronoi_sphere((invLightDir * vec4(rayDir, 1)).xyz * 50).x)); + + fragColor.rgb += (1 - 50 * brightness) * starColor; + } + + fragColor.rgb = 1 - exp(-fragColor.rgb); } \ No newline at end of file diff --git a/src/game.zig b/src/game.zig index 6561d4bb0..da292b3dd 100644 --- a/src/game.zig +++ b/src/game.zig @@ -488,7 +488,7 @@ pub const Player = struct { // MARK: Player }; pub const World = struct { // MARK: World - const dayCycle: u63 = 12000; // Length of one in-game day in 100ms. Midnight is at DAY_CYCLE/2. Sunrise and sunset each take about 1/16 of the day. Currently set to 20 minutes + pub const dayCycle: u63 = 12000; // Length of one in-game day in 100ms. Midnight is at DAY_CYCLE/2. Sunrise and sunset each take about 1/16 of the day. Currently set to 20 minutes conn: *Connection, manager: *ConnectionManager, diff --git a/src/renderer.zig b/src/renderer.zig index 202e98fa8..fa8aff822 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -590,7 +590,9 @@ pub const Skybox = struct { var shader: Shader = undefined; var uniforms: struct { time: c_int, - sunPos: c_int, + altitude: c_int, + lightDir: c_int, + invLightDir: c_int, viewMatrix: c_int, projectionMatrix: c_int, } = undefined; @@ -598,14 +600,10 @@ pub const Skybox = struct { var vao: c_uint = undefined; var vbos: [2]c_uint = undefined; - var lastTime: i128 = undefined; - var time: f32 = 0; - fn init() void { - lastTime = std.time.nanoTimestamp(); shader = Shader.initAndGetUniforms("assets/cubyz/shaders/skybox/vertex.vs", "assets/cubyz/shaders/skybox/fragment.fs", "", &uniforms); shader.bind(); - // 4 sides of a simple cube with some panorama texture on it. + const rawData = [_]f32 { -1, -1, -1, 1, -1, -1, @@ -650,16 +648,16 @@ pub const Skybox = struct { const viewMatrix = game.camera.viewMatrix; shader.bind(); - const newTime = std.time.nanoTimestamp(); - time += @as(f32, @floatFromInt(newTime - lastTime))/1e9; - lastTime = newTime; + const time = @as(f32, @floatFromInt(@mod(main.game.world.?.gameTime.load(.monotonic), main.game.World.dayCycle))) / (main.game.World.dayCycle); + + const lightMatrix = Mat4f.rotationY(-std.math.pi / 2.0 - time * std.math.pi * 2); + + const invLightMatrix = Mat4f.rotationY(time * std.math.pi * 2 + std.math.pi / 2.0); - var sunPos = Vec3f {1, 0, 0}; - sunPos = vec.rotateZ(sunPos, time * std.math.pi * 2); - sunPos = vec.rotateX(sunPos, 60 * std.math.rad_per_deg); - c.glUniform1f(uniforms.time, time); - c.glUniform3fv(uniforms.sunPos, 1, @ptrCast(&sunPos)); + c.glUniform1f(uniforms.altitude, @floatCast(game.Player.super.pos[2])); + c.glUniformMatrix4fv(uniforms.lightDir, 1, c.GL_TRUE, @ptrCast(&lightMatrix)); + c.glUniformMatrix4fv(uniforms.invLightDir, 1, c.GL_TRUE, @ptrCast(&invLightMatrix)); c.glUniformMatrix4fv(uniforms.viewMatrix, 1, c.GL_TRUE, @ptrCast(&viewMatrix)); c.glUniformMatrix4fv(uniforms.projectionMatrix, 1, c.GL_TRUE, @ptrCast(&game.projectionMatrix)); From d9647065ebb6eb98238c745d0d5901c4317d527e Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Mon, 20 Jan 2025 02:45:08 -0500 Subject: [PATCH 3/9] change crlf to lf --- assets/cubyz/shaders/skybox/fragment.fs | 352 ++++++++++++------------ 1 file changed, 176 insertions(+), 176 deletions(-) diff --git a/assets/cubyz/shaders/skybox/fragment.fs b/assets/cubyz/shaders/skybox/fragment.fs index 17a62fc97..d152aaa4f 100644 --- a/assets/cubyz/shaders/skybox/fragment.fs +++ b/assets/cubyz/shaders/skybox/fragment.fs @@ -1,177 +1,177 @@ -#version 330 - -layout (location=0) out vec4 fragColor; - -in vec3 pos; - -#define PI 3.141592 -#define iSteps 16 -#define jSteps 8 -#define ATMOS_SIZE 6371e3 - -uniform mat4 lightDir; -uniform mat4 invLightDir; -uniform float altitude; - -vec2 rsi(vec3 r0, vec3 rd, float sr) { - float a = dot(rd, rd); - float b = 2.0 * dot(rd, r0); - float c = dot(r0, r0) - (sr * sr); - float d = (b*b) - 4.0*a*c; - if (d < 0.0) return vec2(1e5,-1e5); - return vec2( - (-b - sqrt(d))/(2.0*a), - (-b + sqrt(d))/(2.0*a) - ); -} - -vec3 atmosphere(vec3 r, vec3 r0, vec3 pSun, float iSun, float rPlanet, float rAtmos, vec3 kRlh, float kMie, float shRlh, float shMie, float g) { - pSun = normalize(pSun); - r = normalize(r); - - vec2 p = rsi(r0, r, rAtmos); - if (p.x > p.y) return vec3(0,0,0); - p.y = min(p.y, rsi(r0, r, rPlanet).x); - float iStepSize = (p.y - p.x) / float(iSteps); - - float iTime = 0.0; - - vec3 totalRlh = vec3(0,0,0); - vec3 totalMie = vec3(0,0,0); - - float iOdRlh = 0.0; - float iOdMie = 0.0; - - float mu = dot(r, pSun); - float mumu = mu * mu; - float gg = g * g; - float pRlh = 3.0 / (16.0 * PI) * (1.0 + mumu); - float pMie = 3.0 / (8.0 * PI) * ((1.0 - gg) * (mumu + 1.0)) / (pow(1.0 + gg - 2.0 * mu * g, 1.5) * (2.0 + gg)); - - for (int i = 0; i < iSteps; i++) { - - vec3 iPos = r0 + r * (iTime + iStepSize * 0.5); - - float iHeight = length(iPos) - rPlanet; - - float odStepRlh = exp(-iHeight / shRlh) * iStepSize; - float odStepMie = exp(-iHeight / shMie) * iStepSize; - - iOdRlh += odStepRlh; - iOdMie += odStepMie; - - float jStepSize = rsi(iPos, pSun, rAtmos).y / float(jSteps); - - float jTime = 0.0; - - float jOdRlh = 0.0; - float jOdMie = 0.0; - - for (int j = 0; j < jSteps; j++) { - - vec3 jPos = iPos + pSun * (jTime + jStepSize * 0.5); - - float jHeight = length(jPos) - rPlanet; - - jOdRlh += exp(-jHeight / shRlh) * jStepSize; - jOdMie += exp(-jHeight / shMie) * jStepSize; - - jTime += jStepSize; - } - - vec3 attn = exp(-(kMie * (iOdMie + jOdMie) + kRlh * (iOdRlh + jOdRlh))); - - totalRlh += odStepRlh * attn; - totalMie += odStepMie * attn; - - iTime += iStepSize; - - } - - return iSun * (pRlh * kRlh * totalRlh + pMie * kMie * totalMie); -} - -vec3 hash( vec3 x ) -{ - x = vec3( dot(x,vec3(127.1,311.7, 74.7)), - dot(x,vec3(269.5,183.3,246.1)), - dot(x,vec3(113.5,271.9,124.6))); - - return fract(sin(x)*43758.5453123); -} - -vec3 voronoi_sphere( in vec3 x ) -{ - vec3 p = floor( x ); - vec3 f = fract( x ); - - float sphere_radius = length(x); - - float id = 0.0; - vec2 res = vec2( 100.0 ); - for( int k=-1; k<=1; k++ ) - for( int j=-1; j<=1; j++ ) - for( int i=-1; i<=1; i++ ) - { - vec3 b = vec3( float(i), float(j), float(k) ); - vec3 r = vec3( b ) - f + hash( p + b ); - - vec3 cell_center_in_os = p + b + vec3(0.5); - float dist_between_cell_center_and_sphere_surface = abs(length(cell_center_in_os) - sphere_radius); - - float max_cell_dist = 0.5; - if (dist_between_cell_center_and_sphere_surface < max_cell_dist) - { - - vec3 r_in_os = x + r; - r_in_os = normalize(r_in_os) * sphere_radius; - r = r_in_os - x; - - float d = dot( r, r ); - if( d < res.x ) - { - id = dot( p+b, vec3(1.0,57.0,113.0 ) ); - res = vec2( d, res.x ); - } - else if( d < res.y ) - { - res.y = d; - } - } - } - - return vec3( sqrt( res ), abs(id) ); -} - -void main() { - vec3 rayDir = normalize(pos); - - vec3 sunDir = (lightDir * vec4(1, 0, 0, 1)).xyz; - - vec3 color = atmosphere( - rayDir, - vec3(0,0,6372e3 + altitude), - sunDir, - 22.0, - 6371e3, - 6471e3, - vec3(5.5e-6, 13.0e-6, 22.4e-6), - 21e-6, - 8e3, - 1.2e3, - 0.758 - ); - - color += smoothstep(0.998, 0.999, dot(rayDir, sunDir)) * 20; - - fragColor = vec4(color, 1); - - float brightness = dot(color, vec3(0.2126, 0.7152, 0.0722)); - if (brightness < 0.02) { - vec3 starColor = vec3(smoothstep(0.07, 0.05, voronoi_sphere((invLightDir * vec4(rayDir, 1)).xyz * 50).x)); - - fragColor.rgb += (1 - 50 * brightness) * starColor; - } - - fragColor.rgb = 1 - exp(-fragColor.rgb); +#version 330 + +layout (location=0) out vec4 fragColor; + +in vec3 pos; + +#define PI 3.141592 +#define iSteps 16 +#define jSteps 8 +#define ATMOS_SIZE 6371e3 + +uniform mat4 lightDir; +uniform mat4 invLightDir; +uniform float altitude; + +vec2 rsi(vec3 r0, vec3 rd, float sr) { + float a = dot(rd, rd); + float b = 2.0 * dot(rd, r0); + float c = dot(r0, r0) - (sr * sr); + float d = (b*b) - 4.0*a*c; + if (d < 0.0) return vec2(1e5,-1e5); + return vec2( + (-b - sqrt(d))/(2.0*a), + (-b + sqrt(d))/(2.0*a) + ); +} + +vec3 atmosphere(vec3 r, vec3 r0, vec3 pSun, float iSun, float rPlanet, float rAtmos, vec3 kRlh, float kMie, float shRlh, float shMie, float g) { + pSun = normalize(pSun); + r = normalize(r); + + vec2 p = rsi(r0, r, rAtmos); + if (p.x > p.y) return vec3(0,0,0); + p.y = min(p.y, rsi(r0, r, rPlanet).x); + float iStepSize = (p.y - p.x) / float(iSteps); + + float iTime = 0.0; + + vec3 totalRlh = vec3(0,0,0); + vec3 totalMie = vec3(0,0,0); + + float iOdRlh = 0.0; + float iOdMie = 0.0; + + float mu = dot(r, pSun); + float mumu = mu * mu; + float gg = g * g; + float pRlh = 3.0 / (16.0 * PI) * (1.0 + mumu); + float pMie = 3.0 / (8.0 * PI) * ((1.0 - gg) * (mumu + 1.0)) / (pow(1.0 + gg - 2.0 * mu * g, 1.5) * (2.0 + gg)); + + for (int i = 0; i < iSteps; i++) { + + vec3 iPos = r0 + r * (iTime + iStepSize * 0.5); + + float iHeight = length(iPos) - rPlanet; + + float odStepRlh = exp(-iHeight / shRlh) * iStepSize; + float odStepMie = exp(-iHeight / shMie) * iStepSize; + + iOdRlh += odStepRlh; + iOdMie += odStepMie; + + float jStepSize = rsi(iPos, pSun, rAtmos).y / float(jSteps); + + float jTime = 0.0; + + float jOdRlh = 0.0; + float jOdMie = 0.0; + + for (int j = 0; j < jSteps; j++) { + + vec3 jPos = iPos + pSun * (jTime + jStepSize * 0.5); + + float jHeight = length(jPos) - rPlanet; + + jOdRlh += exp(-jHeight / shRlh) * jStepSize; + jOdMie += exp(-jHeight / shMie) * jStepSize; + + jTime += jStepSize; + } + + vec3 attn = exp(-(kMie * (iOdMie + jOdMie) + kRlh * (iOdRlh + jOdRlh))); + + totalRlh += odStepRlh * attn; + totalMie += odStepMie * attn; + + iTime += iStepSize; + + } + + return iSun * (pRlh * kRlh * totalRlh + pMie * kMie * totalMie); +} + +vec3 hash( vec3 x ) +{ + x = vec3( dot(x,vec3(127.1,311.7, 74.7)), + dot(x,vec3(269.5,183.3,246.1)), + dot(x,vec3(113.5,271.9,124.6))); + + return fract(sin(x)*43758.5453123); +} + +vec3 voronoi_sphere( in vec3 x ) +{ + vec3 p = floor( x ); + vec3 f = fract( x ); + + float sphere_radius = length(x); + + float id = 0.0; + vec2 res = vec2( 100.0 ); + for( int k=-1; k<=1; k++ ) + for( int j=-1; j<=1; j++ ) + for( int i=-1; i<=1; i++ ) + { + vec3 b = vec3( float(i), float(j), float(k) ); + vec3 r = vec3( b ) - f + hash( p + b ); + + vec3 cell_center_in_os = p + b + vec3(0.5); + float dist_between_cell_center_and_sphere_surface = abs(length(cell_center_in_os) - sphere_radius); + + float max_cell_dist = 0.5; + if (dist_between_cell_center_and_sphere_surface < max_cell_dist) + { + + vec3 r_in_os = x + r; + r_in_os = normalize(r_in_os) * sphere_radius; + r = r_in_os - x; + + float d = dot( r, r ); + if( d < res.x ) + { + id = dot( p+b, vec3(1.0,57.0,113.0 ) ); + res = vec2( d, res.x ); + } + else if( d < res.y ) + { + res.y = d; + } + } + } + + return vec3( sqrt( res ), abs(id) ); +} + +void main() { + vec3 rayDir = normalize(pos); + + vec3 sunDir = (lightDir * vec4(1, 0, 0, 1)).xyz; + + vec3 color = atmosphere( + rayDir, + vec3(0,0,6372e3 + altitude), + sunDir, + 22.0, + 6371e3, + 6471e3, + vec3(5.5e-6, 13.0e-6, 22.4e-6), + 21e-6, + 8e3, + 1.2e3, + 0.758 + ); + + color += smoothstep(0.998, 0.999, dot(rayDir, sunDir)) * 20; + + fragColor = vec4(color, 1); + + float brightness = dot(color, vec3(0.2126, 0.7152, 0.0722)); + if (brightness < 0.02) { + vec3 starColor = vec3(smoothstep(0.07, 0.05, voronoi_sphere((invLightDir * vec4(rayDir, 1)).xyz * 50).x)); + + fragColor.rgb += (1 - 50 * brightness) * starColor; + } + + fragColor.rgb = 1 - exp(-fragColor.rgb); } \ No newline at end of file From c6ccd847f936c226d1f3a94f7edd3aee88e9b483 Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Mon, 20 Jan 2025 02:48:09 -0500 Subject: [PATCH 4/9] please work --- assets/cubyz/shaders/skybox/vertex.vs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/assets/cubyz/shaders/skybox/vertex.vs b/assets/cubyz/shaders/skybox/vertex.vs index 99927c635..4acafd41f 100644 --- a/assets/cubyz/shaders/skybox/vertex.vs +++ b/assets/cubyz/shaders/skybox/vertex.vs @@ -1,14 +1,14 @@ -#version 330 - -layout (location=0) in vec3 vertexPos; - -out vec3 pos; - -uniform mat4 viewMatrix; -uniform mat4 projectionMatrix; - -void main() { - gl_Position = projectionMatrix*viewMatrix*vec4(vertexPos, 1); - - pos = vertexPos; +#version 330 + +layout (location=0) in vec3 vertexPos; + +out vec3 pos; + +uniform mat4 viewMatrix; +uniform mat4 projectionMatrix; + +void main() { + gl_Position = projectionMatrix*viewMatrix*vec4(vertexPos, 1); + + pos = vertexPos; } \ No newline at end of file From 4131218a8896f41c85bb8f8b9524839f264a7ec5 Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Mon, 20 Jan 2025 02:49:45 -0500 Subject: [PATCH 5/9] please --- .vscode/settings.json | 3 +++ assets/cubyz/shaders/deferred_render_pass.fs | 8 +++----- 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..37441beed --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "files.eol": "\n" +} \ No newline at end of file diff --git a/assets/cubyz/shaders/deferred_render_pass.fs b/assets/cubyz/shaders/deferred_render_pass.fs index 098059774..d1f8babcf 100644 --- a/assets/cubyz/shaders/deferred_render_pass.fs +++ b/assets/cubyz/shaders/deferred_render_pass.fs @@ -57,11 +57,9 @@ void main() { fragColor = texture(color, texCoords); fragColor += texture(bloomColor, texCoords); - // if (texture(depthTexture, texCoords).r != 1) { // Don't calculate fog for the skybox - float densityAdjustment = sqrt(dot(tanXY*(texCoords*2 - 1), tanXY*(texCoords*2 - 1)) + 1); - float fogDistance = calculateFogDistance(texture(depthTexture, texCoords).r, fog.density*densityAdjustment); - fragColor.rgb = applyFrontfaceFog(fogDistance, fog.color, fragColor.rgb); - // } + float densityAdjustment = sqrt(dot(tanXY*(texCoords*2 - 1), tanXY*(texCoords*2 - 1)) + 1); + float fogDistance = calculateFogDistance(texture(depthTexture, texCoords).r, fog.density*densityAdjustment); + fragColor.rgb = applyFrontfaceFog(fogDistance, fog.color, fragColor.rgb); float maxColor = max(1.0, max(fragColor.r, max(fragColor.g, fragColor.b))); fragColor.rgb = fragColor.rgb/maxColor; From 4a55bcfa050d980dd209b636b21147ac08999b10 Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Mon, 20 Jan 2025 03:03:28 -0500 Subject: [PATCH 6/9] remove thing --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 37441beed..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "files.eol": "\n" -} \ No newline at end of file From 2ee73f2517be244590e24c5ba6b59eb696f73552 Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Mon, 20 Jan 2025 03:04:41 -0500 Subject: [PATCH 7/9] why --- assets/cubyz/shaders/skybox/fragment.fs | 180 ++++++++++++------------ 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/assets/cubyz/shaders/skybox/fragment.fs b/assets/cubyz/shaders/skybox/fragment.fs index d152aaa4f..d2af89459 100644 --- a/assets/cubyz/shaders/skybox/fragment.fs +++ b/assets/cubyz/shaders/skybox/fragment.fs @@ -14,81 +14,81 @@ uniform mat4 invLightDir; uniform float altitude; vec2 rsi(vec3 r0, vec3 rd, float sr) { - float a = dot(rd, rd); - float b = 2.0 * dot(rd, r0); - float c = dot(r0, r0) - (sr * sr); - float d = (b*b) - 4.0*a*c; - if (d < 0.0) return vec2(1e5,-1e5); - return vec2( - (-b - sqrt(d))/(2.0*a), - (-b + sqrt(d))/(2.0*a) - ); + float a = dot(rd, rd); + float b = 2.0 * dot(rd, r0); + float c = dot(r0, r0) - (sr * sr); + float d = (b*b) - 4.0*a*c; + if (d < 0.0) return vec2(1e5,-1e5); + return vec2( + (-b - sqrt(d))/(2.0*a), + (-b + sqrt(d))/(2.0*a) + ); } vec3 atmosphere(vec3 r, vec3 r0, vec3 pSun, float iSun, float rPlanet, float rAtmos, vec3 kRlh, float kMie, float shRlh, float shMie, float g) { - pSun = normalize(pSun); - r = normalize(r); + pSun = normalize(pSun); + r = normalize(r); - vec2 p = rsi(r0, r, rAtmos); - if (p.x > p.y) return vec3(0,0,0); - p.y = min(p.y, rsi(r0, r, rPlanet).x); - float iStepSize = (p.y - p.x) / float(iSteps); + vec2 p = rsi(r0, r, rAtmos); + if (p.x > p.y) return vec3(0,0,0); + p.y = min(p.y, rsi(r0, r, rPlanet).x); + float iStepSize = (p.y - p.x) / float(iSteps); - float iTime = 0.0; + float iTime = 0.0; - vec3 totalRlh = vec3(0,0,0); - vec3 totalMie = vec3(0,0,0); + vec3 totalRlh = vec3(0,0,0); + vec3 totalMie = vec3(0,0,0); - float iOdRlh = 0.0; - float iOdMie = 0.0; + float iOdRlh = 0.0; + float iOdMie = 0.0; - float mu = dot(r, pSun); - float mumu = mu * mu; - float gg = g * g; - float pRlh = 3.0 / (16.0 * PI) * (1.0 + mumu); - float pMie = 3.0 / (8.0 * PI) * ((1.0 - gg) * (mumu + 1.0)) / (pow(1.0 + gg - 2.0 * mu * g, 1.5) * (2.0 + gg)); + float mu = dot(r, pSun); + float mumu = mu * mu; + float gg = g * g; + float pRlh = 3.0 / (16.0 * PI) * (1.0 + mumu); + float pMie = 3.0 / (8.0 * PI) * ((1.0 - gg) * (mumu + 1.0)) / (pow(1.0 + gg - 2.0 * mu * g, 1.5) * (2.0 + gg)); - for (int i = 0; i < iSteps; i++) { + for (int i = 0; i < iSteps; i++) { - vec3 iPos = r0 + r * (iTime + iStepSize * 0.5); + vec3 iPos = r0 + r * (iTime + iStepSize * 0.5); - float iHeight = length(iPos) - rPlanet; + float iHeight = length(iPos) - rPlanet; - float odStepRlh = exp(-iHeight / shRlh) * iStepSize; - float odStepMie = exp(-iHeight / shMie) * iStepSize; + float odStepRlh = exp(-iHeight / shRlh) * iStepSize; + float odStepMie = exp(-iHeight / shMie) * iStepSize; - iOdRlh += odStepRlh; - iOdMie += odStepMie; + iOdRlh += odStepRlh; + iOdMie += odStepMie; - float jStepSize = rsi(iPos, pSun, rAtmos).y / float(jSteps); + float jStepSize = rsi(iPos, pSun, rAtmos).y / float(jSteps); - float jTime = 0.0; + float jTime = 0.0; - float jOdRlh = 0.0; - float jOdMie = 0.0; + float jOdRlh = 0.0; + float jOdMie = 0.0; - for (int j = 0; j < jSteps; j++) { + for (int j = 0; j < jSteps; j++) { - vec3 jPos = iPos + pSun * (jTime + jStepSize * 0.5); + vec3 jPos = iPos + pSun * (jTime + jStepSize * 0.5); - float jHeight = length(jPos) - rPlanet; + float jHeight = length(jPos) - rPlanet; - jOdRlh += exp(-jHeight / shRlh) * jStepSize; - jOdMie += exp(-jHeight / shMie) * jStepSize; + jOdRlh += exp(-jHeight / shRlh) * jStepSize; + jOdMie += exp(-jHeight / shMie) * jStepSize; - jTime += jStepSize; - } + jTime += jStepSize; + } - vec3 attn = exp(-(kMie * (iOdMie + jOdMie) + kRlh * (iOdRlh + jOdRlh))); + vec3 attn = exp(-(kMie * (iOdMie + jOdMie) + kRlh * (iOdRlh + jOdRlh))); - totalRlh += odStepRlh * attn; - totalMie += odStepMie * attn; + totalRlh += odStepRlh * attn; + totalMie += odStepMie * attn; - iTime += iStepSize; + iTime += iStepSize; - } + } - return iSun * (pRlh * kRlh * totalRlh + pMie * kMie * totalMie); + return iSun * (pRlh * kRlh * totalRlh + pMie * kMie * totalMie); } vec3 hash( vec3 x ) @@ -102,45 +102,45 @@ vec3 hash( vec3 x ) vec3 voronoi_sphere( in vec3 x ) { - vec3 p = floor( x ); - vec3 f = fract( x ); + vec3 p = floor( x ); + vec3 f = fract( x ); - float sphere_radius = length(x); + float sphere_radius = length(x); float id = 0.0; - vec2 res = vec2( 100.0 ); - for( int k=-1; k<=1; k++ ) - for( int j=-1; j<=1; j++ ) - for( int i=-1; i<=1; i++ ) - { - vec3 b = vec3( float(i), float(j), float(k) ); - vec3 r = vec3( b ) - f + hash( p + b ); + vec2 res = vec2( 100.0 ); + for( int k=-1; k<=1; k++ ) + for( int j=-1; j<=1; j++ ) + for( int i=-1; i<=1; i++ ) + { + vec3 b = vec3( float(i), float(j), float(k) ); + vec3 r = vec3( b ) - f + hash( p + b ); - vec3 cell_center_in_os = p + b + vec3(0.5); - float dist_between_cell_center_and_sphere_surface = abs(length(cell_center_in_os) - sphere_radius); + vec3 cell_center_in_os = p + b + vec3(0.5); + float dist_between_cell_center_and_sphere_surface = abs(length(cell_center_in_os) - sphere_radius); - float max_cell_dist = 0.5; - if (dist_between_cell_center_and_sphere_surface < max_cell_dist) - { + float max_cell_dist = 0.5; + if (dist_between_cell_center_and_sphere_surface < max_cell_dist) + { vec3 r_in_os = x + r; r_in_os = normalize(r_in_os) * sphere_radius; r = r_in_os - x; - float d = dot( r, r ); - if( d < res.x ) - { - id = dot( p+b, vec3(1.0,57.0,113.0 ) ); - res = vec2( d, res.x ); - } - else if( d < res.y ) - { - res.y = d; - } - } - } - - return vec3( sqrt( res ), abs(id) ); + float d = dot( r, r ); + if( d < res.x ) + { + id = dot( p+b, vec3(1.0,57.0,113.0 ) ); + res = vec2( d, res.x ); + } + else if( d < res.y ) + { + res.y = d; + } + } + } + + return vec3( sqrt( res ), abs(id) ); } void main() { @@ -149,18 +149,18 @@ void main() { vec3 sunDir = (lightDir * vec4(1, 0, 0, 1)).xyz; vec3 color = atmosphere( - rayDir, - vec3(0,0,6372e3 + altitude), - sunDir, - 22.0, - 6371e3, - 6471e3, - vec3(5.5e-6, 13.0e-6, 22.4e-6), - 21e-6, - 8e3, - 1.2e3, - 0.758 - ); + rayDir, + vec3(0,0,6372e3 + altitude), + sunDir, + 22.0, + 6371e3, + 6471e3, + vec3(5.5e-6, 13.0e-6, 22.4e-6), + 21e-6, + 8e3, + 1.2e3, + 0.758 + ); color += smoothstep(0.998, 0.999, dot(rayDir, sunDir)) * 20; From ef36386be16ddedd229eeec3d52cad88585392bb Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Mon, 20 Jan 2025 03:06:04 -0500 Subject: [PATCH 8/9] why does my editor have to ruin all the formatting --- assets/cubyz/shaders/skybox/fragment.fs | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/assets/cubyz/shaders/skybox/fragment.fs b/assets/cubyz/shaders/skybox/fragment.fs index d2af89459..33f20e302 100644 --- a/assets/cubyz/shaders/skybox/fragment.fs +++ b/assets/cubyz/shaders/skybox/fragment.fs @@ -93,9 +93,9 @@ vec3 atmosphere(vec3 r, vec3 r0, vec3 pSun, float iSun, float rPlanet, float rAt vec3 hash( vec3 x ) { - x = vec3( dot(x,vec3(127.1,311.7, 74.7)), - dot(x,vec3(269.5,183.3,246.1)), - dot(x,vec3(113.5,271.9,124.6))); + x = vec3(dot(x,vec3(127.1,311.7, 74.7)), + dot(x,vec3(269.5,183.3,246.1)), + dot(x,vec3(113.5,271.9,124.6))); return fract(sin(x)*43758.5453123); } @@ -150,16 +150,16 @@ void main() { vec3 color = atmosphere( rayDir, - vec3(0,0,6372e3 + altitude), - sunDir, - 22.0, - 6371e3, - 6471e3, - vec3(5.5e-6, 13.0e-6, 22.4e-6), - 21e-6, - 8e3, - 1.2e3, - 0.758 + vec3(0,0,6372e3 + altitude), + sunDir, + 22.0, + 6371e3, + 6471e3, + vec3(5.5e-6, 13.0e-6, 22.4e-6), + 21e-6, + 8e3, + 1.2e3, + 0.758 ); color += smoothstep(0.998, 0.999, dot(rayDir, sunDir)) * 20; From 96243efa563ddaed9f7736c65031b40aaf36246a Mon Sep 17 00:00:00 2001 From: OneAvargeCoder193 Date: Mon, 20 Jan 2025 03:06:59 -0500 Subject: [PATCH 9/9] hopefully the last indentation issue --- assets/cubyz/shaders/skybox/fragment.fs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/assets/cubyz/shaders/skybox/fragment.fs b/assets/cubyz/shaders/skybox/fragment.fs index 33f20e302..de769dd71 100644 --- a/assets/cubyz/shaders/skybox/fragment.fs +++ b/assets/cubyz/shaders/skybox/fragment.fs @@ -93,9 +93,11 @@ vec3 atmosphere(vec3 r, vec3 r0, vec3 pSun, float iSun, float rPlanet, float rAt vec3 hash( vec3 x ) { - x = vec3(dot(x,vec3(127.1,311.7, 74.7)), - dot(x,vec3(269.5,183.3,246.1)), - dot(x,vec3(113.5,271.9,124.6))); + x = vec3( + dot(x,vec3(127.1,311.7, 74.7)), + dot(x,vec3(269.5,183.3,246.1)), + dot(x,vec3(113.5,271.9,124.6)) + ); return fract(sin(x)*43758.5453123); }