Skip to content

Commit 9d3da77

Browse files
committed
feat: improve visuals & state passing
1 parent b28d6e6 commit 9d3da77

File tree

15 files changed

+291
-275
lines changed

15 files changed

+291
-275
lines changed

godot/scenes/CRT.gdshader

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ float FIXF(float c) { return max(abs(c), 1e-5); }
4545
vec4 FIX4(vec4 c) { return max(abs(c), vec4(1e-5)); }
4646

4747
// 480i uses 59.94 Hz field rate (29.97 fps x 2 fields)
48-
float frame_mod2() {
48+
float frame_mod2() {
4949
if (enable_480i) {
5050
return floor(mod(TIME * 59.94 + interlace_offset, 2.0));
5151
} else {
@@ -144,7 +144,7 @@ vec3 bloom_apply(vec2 uv, vec2 screen_px, float intensity, float radius_px, floa
144144
void fragment() {
145145
// Live framebuffer sizes
146146
vec2 texture_size = vec2(textureSize(screen_tex, 0));
147-
147+
148148
// For 480i clamping: render as if we have low resolution but fill the full canvas
149149
vec2 video_size = clamp_resolution ? vec2(target_width, target_height) : texture_size;
150150
vec2 screen_px = 1.0 / texture_size; // Keep original for bloom calculations

godot/scenes/Main.gdshader

Lines changed: 0 additions & 53 deletions
This file was deleted.

godot/scenes/Main.gdshader.uid

Lines changed: 0 additions & 1 deletion
This file was deleted.

godot/scenes/Main.tscn

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,32 +28,32 @@ glow_enabled = true
2828

2929
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lhr70"]
3030
shader = ExtResource("9_q8u5g")
31-
shader_parameter/CRTgamma = 2.4
31+
shader_parameter/CRTgamma = 2.16
3232
shader_parameter/monitorgamma = 2.2
3333
shader_parameter/d = 3.0
3434
shader_parameter/CURVATURE = 1.0
35-
shader_parameter/R = 2.0
35+
shader_parameter/R = 3.649
3636
shader_parameter/cornersize = 0.03
37-
shader_parameter/cornersmooth = 1000.0
37+
shader_parameter/cornersmooth = 116.075
3838
shader_parameter/x_tilt = 0.0
3939
shader_parameter/y_tilt = 0.0
40-
shader_parameter/overscan_x = 105.0
41-
shader_parameter/overscan_y = 105.0
42-
shader_parameter/DOTMASK = 0.2
40+
shader_parameter/overscan_x = 95.0
41+
shader_parameter/overscan_y = 95.0
42+
shader_parameter/DOTMASK = 0.229
4343
shader_parameter/SHARPER = 1.0
44-
shader_parameter/scanline_weight = 0.6
45-
shader_parameter/lum = 0.15
46-
shader_parameter/enable_480i = true
47-
shader_parameter/interlace_offset = 0.0
44+
shader_parameter/scanline_weight = 0.249
45+
shader_parameter/lum = 0.581
46+
shader_parameter/enable_480i = false
47+
shader_parameter/interlace_offset = 1.0
4848
shader_parameter/clamp_resolution = true
4949
shader_parameter/target_width = 640.0
5050
shader_parameter/target_height = 480.0
5151
shader_parameter/aspect_y_scale = 1.0
5252
shader_parameter/LINEAR_PROCESSING = true
5353
shader_parameter/OVERSAMPLE = true
54-
shader_parameter/bloom_intensity = 0.256
55-
shader_parameter/bloom_threshold = 0.283
56-
shader_parameter/bloom_radius_px = 8.0
54+
shader_parameter/bloom_intensity = 0.136
55+
shader_parameter/bloom_threshold = 0.219
56+
shader_parameter/bloom_radius_px = 0.175
5757
shader_parameter/corner_bg_color = Color(0.0745098, 0.0745098, 0.0941176, 1)
5858

5959
[node name="Main" type="Node3D" node_paths=PackedStringArray("planet") groups=["affected_by_gravity"]]

godot/scenes/Planet/Atmosphere.gdshader

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@ render_mode unshaded, cull_front, depth_draw_never, blend_add;
33

44
uniform float planet_radius : hint_range(0.0, 1e9) = 200000.0;
55
uniform float atmosphere_height : hint_range(0.0, 1e8) = 6000.0;
6-
uniform float outer_radius : hint_range(0.0, 1e9) = 206000.0;
76

8-
uniform float intensity_rayleigh : hint_range(0.0, 2.0) = 0.25;
9-
uniform float intensity_mie : hint_range(0.0, 2.0) = 0.05;
10-
uniform float g : hint_range(-0.99, 0.99) = 0.8;
11-
12-
uniform vec3 rayleigh_color : source_color = vec3(0.55, 0.75, 1.0);
13-
uniform vec3 mie_color : source_color = vec3(1.0, 0.95, 0.9);
7+
// Simplified atmosphere controls
8+
uniform float intensity : hint_range(0.0, 2.0) = 0.5;
9+
uniform vec3 atmosphere_color : source_color = vec3(0.55, 0.75, 1.0);
10+
uniform float density_falloff : hint_range(0.1, 2.0) = 0.8;
11+
uniform float horizon_power : hint_range(1.0, 4.0) = 2.0;
1412

1513
// Sun light direction in planet object-space (points from planet towards sun)
1614
uniform vec3 sun_dir_object = vec3(0.0, -1.0, 0.0);
@@ -19,22 +17,11 @@ uniform vec3 camera_pos_object = vec3(0.0);
1917

2018
varying vec3 v_pos_obj;
2119

22-
float rayleigh_phase(float cosTheta) {
23-
return 3.0 / (16.0 * PI) * (1.0 + cosTheta * cosTheta);
24-
}
25-
26-
float hg_phase(float cosTheta, float g_val) {
27-
float g2 = g_val * g_val;
28-
float denom = pow(max(1.0 + g2 - 2.0 * g_val * cosTheta, 1e-3), 1.5);
29-
return (1.0 / (4.0 * PI)) * (1.0 - g2) / denom;
30-
}
31-
3220
void vertex() {
3321
v_pos_obj = VERTEX;
3422
}
3523

3624
void fragment() {
37-
// Camera position in planet object-space passed from script
3825
vec3 cam_pos_obj = camera_pos_object;
3926
vec3 view_dir = normalize(cam_pos_obj - v_pos_obj);
4027
vec3 up_from_center = normalize(v_pos_obj);
@@ -43,24 +30,24 @@ void fragment() {
4330
// Exponential density falloff with height above surface
4431
float h = max(r - planet_radius, 0.0);
4532
float H = max(atmosphere_height, 1.0);
46-
float density = exp(-h / (0.5 * H));
47-
48-
// Thicker towards horizon for visual oomph
49-
float horizon = pow(1.0 - clamp(dot(up_from_center, view_dir), 0.0, 1.0), 1.25);
50-
float thickness = density * (0.6 + 1.6 * horizon);
33+
float density = exp(-h / (density_falloff * H));
5134

52-
// Phase functions based on sun-view angle
35+
// Enhanced horizon effect for more atmospheric depth
36+
float horizon = 1.0 - clamp(dot(up_from_center, view_dir), 0.0, 1.0);
37+
horizon = pow(horizon, horizon_power);
38+
39+
// Sun direction influence for simple scattering
5340
vec3 sun_dir = normalize(sun_dir_object);
54-
float cosTheta = clamp(dot(view_dir, sun_dir), -1.0, 1.0);
55-
float pr = rayleigh_phase(cosTheta);
56-
float pm = hg_phase(cosTheta, g);
41+
float sun_alignment = clamp(dot(view_dir, sun_dir), 0.0, 1.0);
42+
float scattering = 0.6 + 0.4 * sun_alignment;
5743

58-
vec3 scatter = rayleigh_color * intensity_rayleigh * pr + mie_color * intensity_mie * pm;
59-
vec3 col = scatter * thickness;
44+
// Final atmospheric glow
45+
float thickness = density * horizon * scattering;
46+
vec3 final_color = atmosphere_color * intensity * thickness;
6047

61-
EMISSION = col;
48+
EMISSION = final_color;
6249
ALBEDO = vec3(0.0);
6350
ROUGHNESS = 1.0;
6451
SPECULAR = 0.0;
65-
ALPHA = clamp(length(col), 0.0, 1.0);
52+
ALPHA = clamp(length(final_color), 0.0, 1.0);
6653
}

godot/scenes/Planet/Planet.gd

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -517,14 +517,12 @@ func _update_atmosphere_params() -> void:
517517
if atmosphere_material == null:
518518
return
519519
var shell_height: float = max(1.0, radius * atmosphere_height_scale)
520-
var atm_radius: float = radius + shell_height
521520
atmosphere_material.set_shader_parameter("planet_radius", radius)
522521
atmosphere_material.set_shader_parameter("atmosphere_height", shell_height)
523-
atmosphere_material.set_shader_parameter("intensity_rayleigh", atmosphere_intensity)
524-
atmosphere_material.set_shader_parameter("intensity_mie", atmosphere_mie_intensity)
525-
atmosphere_material.set_shader_parameter("g", clampf(atmosphere_g, -0.99, 0.99))
526-
atmosphere_material.set_shader_parameter("rayleigh_color", atmosphere_color)
527-
atmosphere_material.set_shader_parameter("mie_color", atmosphere_mie_color)
522+
atmosphere_material.set_shader_parameter("intensity", atmosphere_intensity)
523+
atmosphere_material.set_shader_parameter("atmosphere_color", atmosphere_color)
524+
atmosphere_material.set_shader_parameter("density_falloff", 0.8)
525+
atmosphere_material.set_shader_parameter("horizon_power", 2.0)
528526
# Sun direction in world
529527
var light := _get_directional_light()
530528
var sun_dir_world: Vector3 = Vector3(0, -1, 0)
@@ -534,8 +532,6 @@ func _update_atmosphere_params() -> void:
534532
# Convert to planet local/object space
535533
var sun_dir_obj: Vector3 = (global_transform.basis.inverse() * sun_dir_world).normalized()
536534
atmosphere_material.set_shader_parameter("sun_dir_object", sun_dir_obj)
537-
# Visual tweaks
538-
atmosphere_material.set_shader_parameter("outer_radius", atm_radius)
539535
# Camera position in planet object space
540536
var cam := get_viewport().get_camera_3d()
541537
if cam:
@@ -547,11 +543,8 @@ func _update_surface_atmo_params() -> void:
547543
if smat == null:
548544
return
549545
smat.set_shader_parameter("atmo_height", radius * atmosphere_height_scale)
550-
smat.set_shader_parameter("atmo_intensity_rayleigh", atmosphere_intensity)
551-
smat.set_shader_parameter("atmo_intensity_mie", atmosphere_mie_intensity)
552-
smat.set_shader_parameter("atmo_g", clampf(atmosphere_g, -0.99, 0.99))
553-
smat.set_shader_parameter("atmo_rayleigh_color", atmosphere_color)
554-
smat.set_shader_parameter("atmo_mie_color", atmosphere_mie_color)
546+
smat.set_shader_parameter("atmo_intensity", atmosphere_intensity * 0.4)
547+
smat.set_shader_parameter("atmo_color", atmosphere_color)
555548
# Sun direction
556549
var light := _get_directional_light()
557550
var sun_dir_world: Vector3 = Vector3(0, -1, 0)

0 commit comments

Comments
 (0)