render3d: the survey DEM is let go once the height field is made, and the terrain sun shadow is R32F + RG16F

The DEM (R16 with mips, 44 MB) was read only by terrain_generate and kept for the map's life; a
world swap loads its own again. The height-field sun shadow was one RGBA32F for three values and an
unused fourth: the lowest lit height stays 32-bit (a receiver 3000 m up compares against it to a
quarter metre), the occluder distance and the cloud mask go beside it in RG16F (64 -> 32 MB), baked
in a pass of their own (TS_AUX): a pipeline takes one colour format for all its targets, and drawn
together into R32F + RG16F the writes went nowhere and nothing was lit.

-75 MB at every fog level, off included (2008 -> 1933 MB at the overlook); the fog-off frame is
unchanged (0 pixels over 8).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-29 16:38:37 +03:00
parent f8c81e4066
commit c5e58d14ea
89 changed files with 205 additions and 74 deletions

View file

@ -828,7 +828,9 @@ export state Render3dState {
ter_dem_base: float = 0.0
ter_ortho_tex: int = 0 # a photograph of the same window, draped with distance
ter_carpet: int = 0 # the distant-grass carpet (carpet_bake), 0 = none
ter_shadow_tex: int = 0 # height-field sun shadow: RG32F (lowest lit height, occluder distance)
ter_shadow_tex: int = 0 # height-field sun shadow: R32F, the lowest lit height
ter_shadow_prog_aux: int = 0 # the bake of the aux target (TS_AUX)
ter_shadow_aux: int = 0 # beside it, RG16F: the occluder distance and the cloud mask
ter_shadow_yaw: float = 1000000000.0 # the sky yaw it was baked for
ter_shadow_gen: int = -1 # the daylight generation it was baked for
ter_shadow_prog: int = 0

View file

@ -158,7 +158,8 @@ float shadowSlope(int c, vec3 wpos, vec3 n, float tanT) {
// ground texel, G = distance to the occluder that set it. Any receiver — ground, crown,
// card, water — compares its own height, so everything agrees on where the hill's
// shadow falls. The penumbra widens with the occluder's distance like a real one.
uniform sampler2D u_tershadow;
uniform sampler2D u_tershadow; // R: the lowest lit height
uniform sampler2D u_tershadow_aux; // R: the occluder distance, G: the cloud mask
uniform vec2 u_ts_origin;
uniform float u_ts_half;
uniform float u_ts_on;
@ -177,7 +178,7 @@ float terrainShadow(vec3 wpos) {
if (u_ts_on < 0.5) return 1.0;
vec2 uv = (wpos.xz - u_ts_origin) / (2.0 * u_ts_half) + 0.5;
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) return 1.0;
vec2 s = texture(u_tershadow, uv).rg;
vec2 s = vec2(texture(u_tershadow, uv).r, texture(u_tershadow_aux, uv).r);
float w = 0.6 + 0.02 * s.y;
return smoothstep(-w, w, wpos.y + 0.25 - s.x);
}
@ -219,7 +220,7 @@ float sunShadow(vec3 wpos, vec3 n, float viewDepth) {
// patchy sunlight: a cloud layer projected along the sun onto the ground
uniform float u_cloud_shadow; // strength
uniform float u_time;
// the mask is baked into the height-field shadow texture's B (tershadow.frag); the
// the mask is baked beside the height-field shadow, in its aux texture's G (tershadow.frag); the
// projection along the sun and the drift are a uv shift
float cloudShadow(vec3 wpos) {
if (u_cloud_shadow <= 0.0 || u_ts_on < 0.5) return 1.0;
@ -228,7 +229,7 @@ float cloudShadow(vec3 wpos) {
c += vec2(u_time * 3.0, u_time * 1.2);
vec2 uv = (c - u_ts_origin) / (2.0 * u_ts_half) + 0.5;
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) return 1.0;
return 1.0 - u_cloud_shadow * texture(u_tershadow, uv).b;
return 1.0 - u_cloud_shadow * texture(u_tershadow_aux, uv).g;
}
// regional vegetation colour: aspen groves and drier ridges read lighter and yellower than

Binary file not shown.

Binary file not shown.

View file

@ -49,7 +49,8 @@ T 2ee6d2e3 u_prev 5
T 2ee6d2e3 u_scene 6
T 2ee6d2e3 u_shadow 7
T 2ee6d2e3 u_tershadow 8
T 2ee6d2e3 u_ts_height 9
T 2ee6d2e3 u_tershadow_aux 9
T 2ee6d2e3 u_ts_height 10
P 9d3e2ddd fullscreen.vert bloom_down.frag
B 9d3e2ddd frag 1 844
U 9d3e2ddd frag u_cascade_vp 0 mat4 5 64
@ -96,7 +97,8 @@ T 9d3e2ddd u_prefilter 4
T 9d3e2ddd u_shadow 5
T 9d3e2ddd u_src 6
T 9d3e2ddd u_tershadow 7
T 9d3e2ddd u_ts_height 8
T 9d3e2ddd u_tershadow_aux 8
T 9d3e2ddd u_ts_height 9
P c57b4f14 fullscreen.vert bloom_up.frag
B c57b4f14 frag 1 844
U c57b4f14 frag u_cascade_vp 0 mat4 5 64
@ -143,7 +145,8 @@ T c57b4f14 u_prefilter 4
T c57b4f14 u_shadow 5
T c57b4f14 u_src 6
T c57b4f14 u_tershadow 7
T c57b4f14 u_ts_height 8
T c57b4f14 u_tershadow_aux 8
T c57b4f14 u_ts_height 9
P 5161e6ba fullscreen.vert dof.frag
B 5161e6ba frag 1 916
U 5161e6ba frag u_cascade_vp 0 mat4 5 64
@ -194,7 +197,8 @@ T 5161e6ba u_prefilter 5
T 5161e6ba u_shadow 6
T 5161e6ba u_src 7
T 5161e6ba u_tershadow 8
T 5161e6ba u_ts_height 9
T 5161e6ba u_tershadow_aux 9
T 5161e6ba u_ts_height 10
P 4be7acd9 fullscreen.vert heightgen.frag #define DEM;
B 4be7acd9 frag 1 920
U 4be7acd9 frag u_cascade_vp 0 mat4 5 64
@ -251,7 +255,8 @@ T 4be7acd9 u_irradiance 4
T 4be7acd9 u_prefilter 5
T 4be7acd9 u_shadow 6
T 4be7acd9 u_tershadow 7
T 4be7acd9 u_ts_height 8
T 4be7acd9 u_tershadow_aux 8
T 4be7acd9 u_ts_height 9
P 858f5089 fullscreen.vert ibl_brdf.frag
B 858f5089 frag 0 832
U 858f5089 frag u_cascade_vp 0 mat4 5 64
@ -295,7 +300,8 @@ T 858f5089 u_irradiance 3
T 858f5089 u_prefilter 4
T 858f5089 u_shadow 5
T 858f5089 u_tershadow 6
T 858f5089 u_ts_height 7
T 858f5089 u_tershadow_aux 7
T 858f5089 u_ts_height 8
P e18e40c9 fullscreen.vert ibl_irradiance.frag
B e18e40c9 frag 1 836
U e18e40c9 frag u_cascade_vp 0 mat4 5 64
@ -341,7 +347,8 @@ T e18e40c9 u_prefilter 4
T e18e40c9 u_shadow 5
T e18e40c9 u_sky 6
T e18e40c9 u_tershadow 7
T e18e40c9 u_ts_height 8
T e18e40c9 u_tershadow_aux 8
T e18e40c9 u_ts_height 9
P 638623c2 fullscreen.vert ibl_prefilter.frag
B 638623c2 frag 1 844
U 638623c2 frag u_cascade_vp 0 mat4 5 64
@ -389,7 +396,8 @@ T 638623c2 u_prefilter 4
T 638623c2 u_shadow 5
T 638623c2 u_sky 6
T 638623c2 u_tershadow 7
T 638623c2 u_ts_height 8
T 638623c2 u_tershadow_aux 8
T 638623c2 u_ts_height 9
P 4cf96468 fullscreen.vert sharpen.frag
B 4cf96468 frag 1 852
U 4cf96468 frag u_cascade_vp 0 mat4 5 64
@ -438,7 +446,8 @@ T 4cf96468 u_prefilter 4
T 4cf96468 u_shadow 5
T 4cf96468 u_src 6
T 4cf96468 u_tershadow 7
T 4cf96468 u_ts_height 8
T 4cf96468 u_tershadow_aux 8
T 4cf96468 u_ts_height 9
P 428caa3a fullscreen.vert sky.frag
B 428caa3a frag 1 940
U 428caa3a frag u_cascade_vp 0 mat4 5 64
@ -491,7 +500,8 @@ T 428caa3a u_prefilter 4
T 428caa3a u_shadow 5
T 428caa3a u_sky 6
T 428caa3a u_tershadow 7
T 428caa3a u_ts_height 8
T 428caa3a u_tershadow_aux 8
T 428caa3a u_ts_height 9
P 3e4b62f9 fullscreen.vert ssao_blur.frag
B 3e4b62f9 frag 1 840
U 3e4b62f9 frag u_cascade_vp 0 mat4 5 64
@ -538,7 +548,8 @@ T 3e4b62f9 u_irradiance 5
T 3e4b62f9 u_prefilter 6
T 3e4b62f9 u_shadow 7
T 3e4b62f9 u_tershadow 8
T 3e4b62f9 u_ts_height 9
T 3e4b62f9 u_tershadow_aux 9
T 3e4b62f9 u_ts_height 10
P 676965ab fullscreen.vert ssgi.frag
B 676965ab frag 1 984
U 676965ab frag u_cascade_vp 0 mat4 5 64
@ -591,7 +602,8 @@ T 676965ab u_prefilter 5
T 676965ab u_prev_color 6
T 676965ab u_shadow 7
T 676965ab u_tershadow 8
T 676965ab u_ts_height 9
T 676965ab u_tershadow_aux 9
T 676965ab u_ts_height 10
P a45356c7 fullscreen.vert ternormal.frag
B a45356c7 frag 1 836
U a45356c7 frag u_cascade_vp 0 mat4 5 64
@ -637,7 +649,8 @@ T a45356c7 u_prefilter 4
T a45356c7 u_shadow 5
T a45356c7 u_src 6
T a45356c7 u_tershadow 7
T a45356c7 u_ts_height 8
T a45356c7 u_tershadow_aux 8
T a45356c7 u_ts_height 9
P 4a8e9f28 fullscreen.vert tershadow.frag #define NOISE_ONLY;
B 4a8e9f28 frag 1 860
U 4a8e9f28 frag u_cascade_vp 0 mat4 5 64
@ -684,7 +697,56 @@ T 4a8e9f28 u_irradiance 4
T 4a8e9f28 u_prefilter 5
T 4a8e9f28 u_shadow 6
T 4a8e9f28 u_tershadow 7
T 4a8e9f28 u_ts_height 8
T 4a8e9f28 u_tershadow_aux 8
T 4a8e9f28 u_ts_height 9
P 3a1797ab fullscreen.vert tershadow.frag #define NOISE_ONLY;#define TS_AUX;
B 3a1797ab frag 1 860
U 3a1797ab frag u_cascade_vp 0 mat4 5 64
U 3a1797ab frag u_cascade_split 320 float 5 16
U 3a1797ab frag u_cascade_range 400 float 5 16
U 3a1797ab frag u_cascade_texel 480 float 5 16
U 3a1797ab frag u_sun_dir 560 vec3 1 0
U 3a1797ab frag u_sun_color 576 vec3 1 0
U 3a1797ab frag u_cam_pos 592 vec3 1 0
U 3a1797ab frag u_prefilter_levels 604 float 1 0
U 3a1797ab frag u_fog_density 608 float 1 0
U 3a1797ab frag u_fog_height_falloff 612 float 1 0
U 3a1797ab frag u_fog_base 616 float 1 0
U 3a1797ab frag u_clip_y 620 float 1 0
U 3a1797ab frag u_spec_scale 624 float 1 0
U 3a1797ab frag u_sky_rot 632 vec2 1 0
U 3a1797ab frag u_ground_alb 640 vec3 1 0
U 3a1797ab frag u_ground_alb_hi 656 vec3 1 0
U 3a1797ab frag u_ground_hi_y 668 float 1 0
U 3a1797ab frag u_ground_hi_w 672 float 1 0
U 3a1797ab frag u_ibl_scale 688 vec3 1 0
U 3a1797ab frag u_daylight 700 float 1 0
U 3a1797ab frag u_fire_pos 704 vec3 1 0
U 3a1797ab frag u_fire_color 720 vec3 1 0
U 3a1797ab frag u_hand_pos 736 vec3 1 0
U 3a1797ab frag u_hand_color 752 vec3 1 0
U 3a1797ab frag u_hand_dir 768 vec3 1 0
U 3a1797ab frag u_hand_cone 780 float 1 0
U 3a1797ab frag u_hand_reach 784 float 1 0
U 3a1797ab frag u_ts_origin 792 vec2 1 0
U 3a1797ab frag u_ts_half 800 float 1 0
U 3a1797ab frag u_ts_on 804 float 1 0
U 3a1797ab frag u_force_cascade 808 int 1 0
U 3a1797ab frag u_cloud_shadow 812 float 1 0
U 3a1797ab frag u_time 816 float 1 0
U 3a1797ab frag u_fog_inscatter 820 float 1 0
U 3a1797ab frag u_fog_desat 824 float 1 0
U 3a1797ab frag u_fog_wall 828 float 1 0
U 3a1797ab frag u_half 832 float 1 0
U 3a1797ab frag u_sun 848 vec3 1 0
T 3a1797ab u_brdf 2
T 3a1797ab u_height 3
T 3a1797ab u_irradiance 4
T 3a1797ab u_prefilter 5
T 3a1797ab u_shadow 6
T 3a1797ab u_tershadow 7
T 3a1797ab u_tershadow_aux 8
T 3a1797ab u_ts_height 9
P 725523d9 fullscreen.vert tonemap.frag
B 725523d9 frag 1 916
U 725523d9 frag u_cascade_vp 0 mat4 5 64
@ -743,7 +805,8 @@ T 725523d9 u_irradiance 7
T 725523d9 u_prefilter 8
T 725523d9 u_shadow 9
T 725523d9 u_tershadow 10
T 725523d9 u_ts_height 11
T 725523d9 u_tershadow_aux 11
T 725523d9 u_ts_height 12
P a4683767 fullscreen.vert tonemap.frag #define HDR10;
B a4683767 frag 1 928
U a4683767 frag u_cascade_vp 0 mat4 5 64
@ -805,7 +868,8 @@ T a4683767 u_irradiance 7
T a4683767 u_prefilter 8
T a4683767 u_shadow 9
T a4683767 u_tershadow 10
T a4683767 u_ts_height 11
T a4683767 u_tershadow_aux 11
T a4683767 u_ts_height 12
P 74258189 fullscreen.vert volumetric.frag
B 74258189 frag 1 924
U 74258189 frag u_cascade_vp 0 mat4 5 64
@ -858,7 +922,8 @@ T 74258189 u_irradiance 4
T 74258189 u_prefilter 5
T 74258189 u_shadow 6
T 74258189 u_tershadow 7
T 74258189 u_ts_height 8
T 74258189 u_tershadow_aux 8
T 74258189 u_ts_height 9
P d48d6a48 grass.mesh model.frag #define FOLIAGE;#define BLADE;#define MESH;
B d48d6a48 vert 0 4388
U d48d6a48 vert u_view 0 mat4 1 0
@ -938,7 +1003,8 @@ T d48d6a48 u_prefilter 9
T d48d6a48 u_shadow 10
T d48d6a48 u_ter_normal 11
T d48d6a48 u_tershadow 12
T d48d6a48 u_ts_height 13
T d48d6a48 u_tershadow_aux 13
T d48d6a48 u_ts_height 14
P cb13f3c6 grass.vert model.frag #define FOLIAGE;#define BLADE;#define GBLADE;
B cb13f3c6 vert 0 324
U cb13f3c6 vert u_view 0 mat4 1 0
@ -1022,7 +1088,8 @@ T cb13f3c6 u_prefilter 9
T cb13f3c6 u_shadow 10
T cb13f3c6 u_ter_normal 11
T cb13f3c6 u_tershadow 12
T cb13f3c6 u_ts_height 13
T cb13f3c6 u_tershadow_aux 13
T cb13f3c6 u_ts_height 14
P b8cff226 grass.vert model.frag #define FOLIAGE;#define BLADE;#define GBLADE;#define TILES;
B b8cff226 vert 0 4420
U b8cff226 vert u_view 0 mat4 1 0
@ -1107,7 +1174,8 @@ T b8cff226 u_prefilter 9
T b8cff226 u_shadow 10
T b8cff226 u_ter_normal 11
T b8cff226 u_tershadow 12
T b8cff226 u_ts_height 13
T b8cff226 u_tershadow_aux 13
T b8cff226 u_ts_height 14
P 3733fc38 impostor.vert impostor.frag
B 3733fc38 vert 0 232
U 3733fc38 vert u_view 0 mat4 1 0
@ -1170,7 +1238,8 @@ T 3733fc38 u_irradiance 5
T 3733fc38 u_prefilter 6
T 3733fc38 u_shadow 7
T 3733fc38 u_tershadow 8
T 3733fc38 u_ts_height 9
T 3733fc38 u_tershadow_aux 9
T 3733fc38 u_ts_height 10
P 4d4fa91b impostor.vert impostor.frag #define SHADOW_PASS;
B 4d4fa91b vert 0 232
U 4d4fa91b vert u_view 0 mat4 1 0
@ -1233,7 +1302,8 @@ T 4d4fa91b u_irradiance 5
T 4d4fa91b u_prefilter 6
T 4d4fa91b u_shadow 7
T 4d4fa91b u_tershadow 8
T 4d4fa91b u_ts_height 9
T 4d4fa91b u_tershadow_aux 9
T 4d4fa91b u_ts_height 10
P 9dce3246 model.vert bake.frag
B 9dce3246 vert 0 236
U 9dce3246 vert u_view 0 mat4 1 0
@ -1297,7 +1367,8 @@ T 9dce3246 u_irradiance 5
T 9dce3246 u_prefilter 6
T 9dce3246 u_shadow 7
T 9dce3246 u_tershadow 8
T 9dce3246 u_ts_height 9
T 9dce3246 u_tershadow_aux 9
T 9dce3246 u_ts_height 10
P 439a2253 model.vert bake.frag #define CARD;
B 439a2253 vert 0 236
U 439a2253 vert u_view 0 mat4 1 0
@ -1361,7 +1432,8 @@ T 439a2253 u_irradiance 5
T 439a2253 u_prefilter 6
T 439a2253 u_shadow 7
T 439a2253 u_tershadow 8
T 439a2253 u_ts_height 9
T 439a2253 u_tershadow_aux 9
T 439a2253 u_ts_height 10
P 86f427b0 model.vert bake.frag #define FLOWER;
B 86f427b0 vert 0 236
U 86f427b0 vert u_view 0 mat4 1 0
@ -1425,7 +1497,8 @@ T 86f427b0 u_irradiance 5
T 86f427b0 u_prefilter 6
T 86f427b0 u_shadow 7
T 86f427b0 u_tershadow 8
T 86f427b0 u_ts_height 9
T 86f427b0 u_tershadow_aux 9
T 86f427b0 u_ts_height 10
P bfa15301 model.vert depth.frag #define FOLIAGE;#define WIND;#define ALPHA_TEST;
B bfa15301 vert 0 236
U bfa15301 vert u_view 0 mat4 1 0
@ -1488,7 +1561,8 @@ T bfa15301 u_irradiance 4
T bfa15301 u_prefilter 5
T bfa15301 u_shadow 6
T bfa15301 u_tershadow 7
T bfa15301 u_ts_height 8
T bfa15301 u_tershadow_aux 8
T bfa15301 u_ts_height 9
P 266d2401 model.vert depth.frag #define FOLIAGE;#define WIND;#define ALPHA_TEST;#define NEAR_FADE;
B 266d2401 vert 0 236
U 266d2401 vert u_view 0 mat4 1 0
@ -1551,7 +1625,8 @@ T 266d2401 u_irradiance 4
T 266d2401 u_prefilter 5
T 266d2401 u_shadow 6
T 266d2401 u_tershadow 7
T 266d2401 u_ts_height 8
T 266d2401 u_tershadow_aux 8
T 266d2401 u_ts_height 9
P 01089da8 model.vert model.frag
B 01089da8 vert 0 236
U 01089da8 vert u_view 0 mat4 1 0
@ -1622,7 +1697,8 @@ T 01089da8 u_nrm 7
T 01089da8 u_prefilter 8
T 01089da8 u_shadow 9
T 01089da8 u_tershadow 10
T 01089da8 u_ts_height 11
T 01089da8 u_tershadow_aux 11
T 01089da8 u_ts_height 12
P 254e7887 model.vert model.frag #define CARD;#define CHEAP;
B 254e7887 vert 0 236
U 254e7887 vert u_view 0 mat4 1 0
@ -1694,7 +1770,8 @@ T 254e7887 u_nrm 7
T 254e7887 u_prefilter 8
T 254e7887 u_shadow 9
T 254e7887 u_tershadow 10
T 254e7887 u_ts_height 11
T 254e7887 u_tershadow_aux 11
T 254e7887 u_ts_height 12
P 1ce5c5d1 model.vert model.frag #define FOLIAGE;#define WIND;#define ALPHA_TEST;
B 1ce5c5d1 vert 0 236
U 1ce5c5d1 vert u_view 0 mat4 1 0
@ -1765,7 +1842,8 @@ T 1ce5c5d1 u_nrm 7
T 1ce5c5d1 u_prefilter 8
T 1ce5c5d1 u_shadow 9
T 1ce5c5d1 u_tershadow 10
T 1ce5c5d1 u_ts_height 11
T 1ce5c5d1 u_tershadow_aux 11
T 1ce5c5d1 u_ts_height 12
P 5e70d731 model.vert model.frag #define FOLIAGE;#define WIND;#define ALPHA_TEST;#define NEAR_FADE;
B 5e70d731 vert 0 236
U 5e70d731 vert u_view 0 mat4 1 0
@ -1836,7 +1914,8 @@ T 5e70d731 u_nrm 7
T 5e70d731 u_prefilter 8
T 5e70d731 u_shadow 9
T 5e70d731 u_tershadow 10
T 5e70d731 u_ts_height 11
T 5e70d731 u_tershadow_aux 11
T 5e70d731 u_ts_height 12
P f4a2b586 model.vert model.frag #define FOLIAGE;#define WIND;#define BLADE;
B f4a2b586 vert 0 252
U f4a2b586 vert u_view 0 mat4 1 0
@ -1913,7 +1992,8 @@ T f4a2b586 u_nrm 7
T f4a2b586 u_prefilter 8
T f4a2b586 u_shadow 9
T f4a2b586 u_tershadow 10
T f4a2b586 u_ts_height 11
T f4a2b586 u_tershadow_aux 11
T f4a2b586 u_ts_height 12
P b4587cd4 model.vert model.frag #define FOLIAGE;#define WIND;#define CARD;
B b4587cd4 vert 0 236
U b4587cd4 vert u_view 0 mat4 1 0
@ -1985,7 +2065,8 @@ T b4587cd4 u_nrm 7
T b4587cd4 u_prefilter 8
T b4587cd4 u_shadow 9
T b4587cd4 u_tershadow 10
T b4587cd4 u_ts_height 11
T b4587cd4 u_tershadow_aux 11
T b4587cd4 u_ts_height 12
P 4dda406a model.vert model.frag #define FOLIAGE;#define WIND;#define EQ_PASS;
B 4dda406a vert 0 236
U 4dda406a vert u_view 0 mat4 1 0
@ -2056,7 +2137,8 @@ T 4dda406a u_nrm 7
T 4dda406a u_prefilter 8
T 4dda406a u_shadow 9
T 4dda406a u_tershadow 10
T 4dda406a u_ts_height 11
T 4dda406a u_tershadow_aux 11
T 4dda406a u_ts_height 12
P b603a056 model.vert model.frag #define FOLIAGE;#define WIND;#define EQ_PASS;#define NEAR_FADE;
B b603a056 vert 0 236
U b603a056 vert u_view 0 mat4 1 0
@ -2127,7 +2209,8 @@ T b603a056 u_nrm 7
T b603a056 u_prefilter 8
T b603a056 u_shadow 9
T b603a056 u_tershadow 10
T b603a056 u_ts_height 11
T b603a056 u_tershadow_aux 11
T b603a056 u_ts_height 12
P 3b183d8f model.vert model.frag #define FOLIAGE;#define WIND;#define FLOWER;
B 3b183d8f vert 0 236
U 3b183d8f vert u_view 0 mat4 1 0
@ -2198,7 +2281,8 @@ T 3b183d8f u_nrm 7
T 3b183d8f u_prefilter 8
T 3b183d8f u_shadow 9
T 3b183d8f u_tershadow 10
T 3b183d8f u_ts_height 11
T 3b183d8f u_tershadow_aux 11
T 3b183d8f u_ts_height 12
P 79b77ed9 model.vert model.frag #define SHADOW_PASS;#define WIND;#define CARD;
B 79b77ed9 vert 0 236
U 79b77ed9 vert u_view 0 mat4 1 0
@ -2270,7 +2354,8 @@ T 79b77ed9 u_nrm 7
T 79b77ed9 u_prefilter 8
T 79b77ed9 u_shadow 9
T 79b77ed9 u_tershadow 10
T 79b77ed9 u_ts_height 11
T 79b77ed9 u_tershadow_aux 11
T 79b77ed9 u_ts_height 12
P b9fc2041 model.vert model.frag #define WIND;
B b9fc2041 vert 0 236
U b9fc2041 vert u_view 0 mat4 1 0
@ -2341,7 +2426,8 @@ T b9fc2041 u_nrm 7
T b9fc2041 u_prefilter 8
T b9fc2041 u_shadow 9
T b9fc2041 u_tershadow 10
T b9fc2041 u_ts_height 11
T b9fc2041 u_tershadow_aux 11
T b9fc2041 u_ts_height 12
P f34dce08 model.vert shadow.frag #define SHADOW_PASS;
B f34dce08 vert 0 236
U f34dce08 vert u_view 0 mat4 1 0
@ -2404,7 +2490,8 @@ T f34dce08 u_irradiance 4
T f34dce08 u_prefilter 5
T f34dce08 u_shadow 6
T f34dce08 u_tershadow 7
T f34dce08 u_ts_height 8
T f34dce08 u_tershadow_aux 8
T f34dce08 u_ts_height 9
P 512004a1 model.vert shadow.frag #define SHADOW_PASS;#define WIND;
B 512004a1 vert 0 236
U 512004a1 vert u_view 0 mat4 1 0
@ -2467,7 +2554,8 @@ T 512004a1 u_irradiance 4
T 512004a1 u_prefilter 5
T 512004a1 u_shadow 6
T 512004a1 u_tershadow 7
T 512004a1 u_ts_height 8
T 512004a1 u_tershadow_aux 8
T 512004a1 u_ts_height 9
P b964507f model.vert shadow.frag #define SHADOW_PASS;#define WIND;#define ALPHA_TEST;
B b964507f vert 0 236
U b964507f vert u_view 0 mat4 1 0
@ -2530,7 +2618,8 @@ T b964507f u_irradiance 4
T b964507f u_prefilter 5
T b964507f u_shadow 6
T b964507f u_tershadow 7
T b964507f u_ts_height 8
T b964507f u_tershadow_aux 8
T b964507f u_ts_height 9
P 1b654972 overlay.vert overlay.frag
B 1b654972 vert 0 8
U 1b654972 vert u_screen 0 vec2 1 0
@ -2580,8 +2669,9 @@ T 1b654972 u_irradiance 4
T 1b654972 u_prefilter 5
T 1b654972 u_shadow 6
T 1b654972 u_tershadow 7
T 1b654972 u_tex 8
T 1b654972 u_ts_height 9
T 1b654972 u_tershadow_aux 8
T 1b654972 u_tex 9
T 1b654972 u_ts_height 10
P e86f78e8 overlay.vert overlay.frag #define HDR10;
B e86f78e8 vert 0 8
U e86f78e8 vert u_screen 0 vec2 1 0
@ -2633,8 +2723,9 @@ T e86f78e8 u_irradiance 4
T e86f78e8 u_prefilter 5
T e86f78e8 u_shadow 6
T e86f78e8 u_tershadow 7
T e86f78e8 u_tex 8
T e86f78e8 u_ts_height 9
T e86f78e8 u_tershadow_aux 8
T e86f78e8 u_tex 9
T e86f78e8 u_ts_height 10
P 1fde9cd2 skin.vert model.frag
B 1fde9cd2 vert 0 3344
U 1fde9cd2 vert u_model 0 mat4 1 0
@ -2699,7 +2790,8 @@ T 1fde9cd2 u_nrm 7
T 1fde9cd2 u_prefilter 8
T 1fde9cd2 u_shadow 9
T 1fde9cd2 u_tershadow 10
T 1fde9cd2 u_ts_height 11
T 1fde9cd2 u_tershadow_aux 11
T 1fde9cd2 u_ts_height 12
P a5ad521e skin.vert model.frag #define ALPHA_TEST;
B a5ad521e vert 0 3344
U a5ad521e vert u_model 0 mat4 1 0
@ -2764,7 +2856,8 @@ T a5ad521e u_nrm 7
T a5ad521e u_prefilter 8
T a5ad521e u_shadow 9
T a5ad521e u_tershadow 10
T a5ad521e u_ts_height 11
T a5ad521e u_tershadow_aux 11
T a5ad521e u_ts_height 12
P 9068df1c skin.vert outline.frag #define OUTLINE;
B 9068df1c vert 0 3348
U 9068df1c vert u_model 0 mat4 1 0
@ -2823,7 +2916,8 @@ T 9068df1c u_irradiance 4
T 9068df1c u_prefilter 5
T 9068df1c u_shadow 6
T 9068df1c u_tershadow 7
T 9068df1c u_ts_height 8
T 9068df1c u_tershadow_aux 8
T 9068df1c u_ts_height 9
P e9b6300c skin.vert outline.frag #define OUTLINE;#define ALPHA_TEST;
B e9b6300c vert 0 3348
U e9b6300c vert u_model 0 mat4 1 0
@ -2882,7 +2976,8 @@ T e9b6300c u_irradiance 4
T e9b6300c u_prefilter 5
T e9b6300c u_shadow 6
T e9b6300c u_tershadow 7
T e9b6300c u_ts_height 8
T e9b6300c u_tershadow_aux 8
T e9b6300c u_ts_height 9
P b79a1f4e skin.vert shadow.frag #define SHADOW_PASS;
B b79a1f4e vert 0 3344
U b79a1f4e vert u_model 0 mat4 1 0
@ -2939,7 +3034,8 @@ T b79a1f4e u_irradiance 4
T b79a1f4e u_prefilter 5
T b79a1f4e u_shadow 6
T b79a1f4e u_tershadow 7
T b79a1f4e u_ts_height 8
T b79a1f4e u_tershadow_aux 8
T b79a1f4e u_ts_height 9
P a64015f2 skin.vert shadow.frag #define SHADOW_PASS;#define ALPHA_TEST;
B a64015f2 vert 0 3344
U a64015f2 vert u_model 0 mat4 1 0
@ -2996,7 +3092,8 @@ T a64015f2 u_irradiance 4
T a64015f2 u_prefilter 5
T a64015f2 u_shadow 6
T a64015f2 u_tershadow 7
T a64015f2 u_ts_height 8
T a64015f2 u_tershadow_aux 8
T a64015f2 u_ts_height 9
P 2e2908c8 terrain.vert terrain.frag
B 2e2908c8 vert 0 204
U 2e2908c8 vert u_half 0 float 1 0
@ -3075,7 +3172,8 @@ T 2e2908c8 u_snow_d 15
T 2e2908c8 u_sunshadow 16
T 2e2908c8 u_ter_normal 17
T 2e2908c8 u_tershadow 18
T 2e2908c8 u_ts_height 19
T 2e2908c8 u_tershadow_aux 19
T 2e2908c8 u_ts_height 20
P 1f95f31b terrain.vert terrain.frag #define FAR_ONLY;
B 1f95f31b vert 0 204
U 1f95f31b vert u_half 0 float 1 0
@ -3154,7 +3252,8 @@ T 1f95f31b u_snow_d 15
T 1f95f31b u_sunshadow 16
T 1f95f31b u_ter_normal 17
T 1f95f31b u_tershadow 18
T 1f95f31b u_ts_height 19
T 1f95f31b u_tershadow_aux 19
T 1f95f31b u_ts_height 20
P f4382918 terrain.vert terrain.frag #define NEAR_ONLY;
B f4382918 vert 0 204
U f4382918 vert u_half 0 float 1 0
@ -3233,7 +3332,8 @@ T f4382918 u_snow_d 15
T f4382918 u_sunshadow 16
T f4382918 u_ter_normal 17
T f4382918 u_tershadow 18
T f4382918 u_ts_height 19
T f4382918 u_tershadow_aux 19
T f4382918 u_ts_height 20
P f2952361 terrain.vert terrain.frag #define SUN_INLINE;
B f2952361 vert 0 204
U f2952361 vert u_half 0 float 1 0
@ -3312,7 +3412,8 @@ T f2952361 u_snow_d 15
T f2952361 u_sunshadow 16
T f2952361 u_ter_normal 17
T f2952361 u_tershadow 18
T f2952361 u_ts_height 19
T f2952361 u_tershadow_aux 19
T f2952361 u_ts_height 20
P a0f2dbac terrain.vert terrain.frag #define SUN_INLINE;#define FAR_ONLY;
B a0f2dbac vert 0 204
U a0f2dbac vert u_half 0 float 1 0
@ -3391,7 +3492,8 @@ T a0f2dbac u_snow_d 15
T a0f2dbac u_sunshadow 16
T a0f2dbac u_ter_normal 17
T a0f2dbac u_tershadow 18
T a0f2dbac u_ts_height 19
T a0f2dbac u_tershadow_aux 19
T a0f2dbac u_ts_height 20
P 5e4589a1 terrain.vert terrain.frag #define SUN_INLINE;#define NEAR_ONLY;
B 5e4589a1 vert 0 204
U 5e4589a1 vert u_half 0 float 1 0
@ -3470,7 +3572,8 @@ T 5e4589a1 u_snow_d 15
T 5e4589a1 u_sunshadow 16
T 5e4589a1 u_ter_normal 17
T 5e4589a1 u_tershadow 18
T 5e4589a1 u_ts_height 19
T 5e4589a1 u_tershadow_aux 19
T 5e4589a1 u_ts_height 20
P bf3151c8 terrain.vert tersun.frag
B bf3151c8 vert 0 204
U bf3151c8 vert u_half 0 float 1 0
@ -3529,7 +3632,8 @@ T bf3151c8 u_prefilter 5
T bf3151c8 u_shadow 6
T bf3151c8 u_ter_normal 7
T bf3151c8 u_tershadow 8
T bf3151c8 u_ts_height 9
T bf3151c8 u_tershadow_aux 9
T bf3151c8 u_ts_height 10
P 46e2325c water.vert water.frag
B 46e2325c vert 0 152
U 46e2325c vert u_view 0 mat4 1 0
@ -3591,7 +3695,8 @@ T 46e2325c u_refl 6
T 46e2325c u_scene 7
T 46e2325c u_shadow 8
T 46e2325c u_tershadow 9
T 46e2325c u_ts_height 10
T 46e2325c u_tershadow_aux 10
T 46e2325c u_ts_height 11
P b20fdcb5 grass_inst.vert model.frag #define FOLIAGE;#define BLADE;#define GBLADE;#define GINST;
B b20fdcb5 vert 0 160
U b20fdcb5 vert u_view 0 mat4 1 0
@ -3661,4 +3766,5 @@ T b20fdcb5 u_nrm 7
T b20fdcb5 u_prefilter 8
T b20fdcb5 u_shadow 9
T b20fdcb5 u_tershadow 10
T b20fdcb5 u_ts_height 11
T b20fdcb5 u_tershadow_aux 11
T b20fdcb5 u_ts_height 12

View file

@ -10,7 +10,7 @@
// The second channel is the distance to the occluder that set the bound, which widens
// the penumbra the way a real shadow softens with distance from its caster.
in vec2 v_uv;
out vec4 o;
out vec4 o; // TS_AUX: the occluder distance and the cloud mask (RG16F); else the lowest lit height (R32F)
uniform sampler2D u_height;
uniform float u_half;
uniform vec3 u_sun;
@ -31,9 +31,13 @@ void main() {
step *= 1.045;
}
}
// the cloud layer's mask, once, into B: sampled by cloudShadow() with the sun offset and
// the cloud layer's mask, once, into the aux target's G: sampled by cloudShadow() with the sun offset and
// the drift applied as a uv shift, instead of a five-octave fbm in every lit pixel of
// every pass
float cloud = smoothstep(0.02, 0.32, fbm(xz * 0.0011, 5));
o = vec4(lit, at, cloud, 1.0);
#ifdef TS_AUX
o = vec4(at, cloud, 0.0, 1.0);
#else
o = vec4(lit, 0.0, 0.0, 1.0);
#endif
}

View file

@ -16,6 +16,7 @@ fullscreen.vert|ssao_blur.frag|
fullscreen.vert|ssgi.frag|
fullscreen.vert|ternormal.frag|
fullscreen.vert|tershadow.frag|#define NOISE_ONLY;
fullscreen.vert|tershadow.frag|#define NOISE_ONLY;#define TS_AUX;
fullscreen.vert|tonemap.frag|
fullscreen.vert|tonemap.frag|#define HDR10;
fullscreen.vert|volumetric.frag|

View file

@ -239,9 +239,11 @@ function shadow_bind(render3d_st: mut Render3dState, prog: int) -> void {
r3d_bind_tex(render3d_st, prog, "u_shadow", 15, GPU_TEX2D_ARRAY, render3d_st.sh_tex)
# the height-field shadow (terrain.ludic); a stand-in texture keeps the unit valid before the bake
var ts = render3d_st.ter_shadow_tex
var ta = render3d_st.ter_shadow_aux
var ts_on = 1.0
if ts == 0 { ts = render3d_st.ter_height_tex; ts_on = 0.0 }
if ts == 0 or ta == 0 { ts = render3d_st.ter_height_tex; ta = render3d_st.ter_height_tex; ts_on = 0.0 }
r3d_bind_2d(render3d_st, prog, "u_tershadow", 6, ts)
r3d_bind_2d(render3d_st, prog, "u_tershadow_aux", 7, ta)
terrain_bind_height(render3d_st, prog)
u_f(render3d_st, gpu_uniform(render3d_st, prog, "u_ts_on"), ts_on)
u_f(render3d_st, gpu_uniform(render3d_st, prog, "u_ts_half"), float(render3d_st.TERRAIN_HALF))

View file

@ -242,6 +242,9 @@ function terrain_generate__t(render3d_st: mut Render3dState) -> void {
gpu_fb_bind(render3d_st, 0)
gpu_fb_free(render3d_st, fbo)
gpu_program_free(render3d_st, p)
# the survey is read only here: kept, it was 44 MB (R16 with mips) for the life of the map. A
# world swap loads its own again (terrain_reload), and nothing else generates
if render3d_st.ter_dem_tex != 0 { gpu_tex_free(render3d_st, render3d_st.ter_dem_tex); render3d_st.ter_dem_tex = 0 }
gpu_check(render3d_st, "terrain generate")
}
@ -257,12 +260,26 @@ function terrain_bind_height(render3d_st: mut Render3dState, p: int) -> void {
# the sun moves; r3d_frame calls it again when sky_set_yaw has changed the yaw.
function terrain_bake_shadow(render3d_st: mut Render3dState) -> void {
if render3d_st.sun_dir == null { return }
if render3d_st.ter_shadow_tex == 0 { render3d_st.ter_shadow_tex = tex_target(render3d_st, TERRAIN_SHADOW_RES, TERRAIN_SHADOW_RES, GL_RGBA32F, GL_RGBA, GL_FLOAT, GL_LINEAR) }
# the lowest lit height needs 32 bits (a receiver 3000 m up compares against it to a quarter metre);
# the occluder's distance and the cloud mask do not, and go beside it in RG16F - 32 MB where one
# RGBA32F carrying all three (and an unused fourth) was 64
if render3d_st.ter_shadow_tex == 0 { render3d_st.ter_shadow_tex = tex_target(render3d_st, TERRAIN_SHADOW_RES, TERRAIN_SHADOW_RES, GL_R32F, GL_RED, GL_FLOAT, GL_LINEAR) }
if render3d_st.ter_shadow_aux == 0 { render3d_st.ter_shadow_aux = tex_target(render3d_st, TERRAIN_SHADOW_RES, TERRAIN_SHADOW_RES, GL_RG16F, GL_RG, GL_FLOAT, GL_LINEAR) }
if render3d_st.ter_shadow_prog == 0 { render3d_st.ter_shadow_prog = r3d_program(render3d_st, "fullscreen.vert", "tershadow.frag", "#define NOISE_ONLY\n") }
let p = render3d_st.ter_shadow_prog
if render3d_st.ter_shadow_prog_aux == 0 { render3d_st.ter_shadow_prog_aux = r3d_program(render3d_st, "fullscreen.vert", "tershadow.frag", "#define NOISE_ONLY\n#define TS_AUX\n") }
# two passes, one target each: a pipeline takes one colour format for all its targets, and the two
# are R32F and RG16F (drawn together, the second's writes went nowhere and nothing was lit)
terrain_bake_pass(render3d_st, render3d_st.ter_shadow_prog, render3d_st.ter_shadow_tex)
terrain_bake_pass(render3d_st, render3d_st.ter_shadow_prog_aux, render3d_st.ter_shadow_aux)
render3d_st.ter_shadow_yaw = render3d_st.sky_yaw
gpu_check(render3d_st, "terrain shadow bake")
}
# one of the bake's two targets drawn: the march is the same, the define picks what it writes
function terrain_bake_pass(render3d_st: mut Render3dState, p: int, target: int) -> void {
let fbo = gpu_fb_new(render3d_st)
gpu_fb_bind(render3d_st, fbo)
gpu_fb_color(render3d_st, 0, render3d_st.ter_shadow_tex)
gpu_fb_color(render3d_st, 0, target)
gpu_viewport(render3d_st, 0, 0, TERRAIN_SHADOW_RES, TERRAIN_SHADOW_RES)
gpu_depth_test(render3d_st, false)
gpu_blend(render3d_st, false)
@ -274,8 +291,6 @@ function terrain_bake_shadow(render3d_st: mut Render3dState) -> void {
mesh_draw(render3d_st, render3d_st.sky_fullscreen)
gpu_fb_bind(render3d_st, 0)
gpu_fb_free(render3d_st, fbo)
render3d_st.ter_shadow_yaw = render3d_st.sky_yaw
gpu_check(render3d_st, "terrain shadow bake")
}
# height at world (x, z) — float bits, bilinear over the CPU copy