From 44ecd55a86176e414878757cc2025c915e967126 Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Tue, 15 Sep 2026 17:26:39 +0300 Subject: [PATCH] render3d(vulkan): the ground reads the sun cascades itself - no separate terrain sun pass tersun.frag rasterised every terrain patch a second time into a screen buffer, because on OpenGL the cascade read inside terrain.frag fell off a driver cliff (about 6 ms a frame). Vulkan has no such cliff: its terrain programs are the SUN_INLINE variant, which evaluates the same two tiers with the same normal and cross-fade in the ground's own shader, and terrain_draw skips the pass - in the frame and in the water reflection. OpenGL keeps the pass. R3D_SUN_PASS=1 keeps it on Vulkan, for comparing. Mac Vulkan town 1759 -> 1692 draws; frames within 2/255 of the pass (15331 px, float rounding). PC camp 1984 -> 1882 draws, 3.9 s for 400 frames either way, self-tests 59/59, validation 0. OpenGL frames byte-identical. Co-Authored-By: Claude Opus 5 --- .../shaders/spv/5e4589a1.frag.spv | Bin 0 -> 100348 bytes .../shaders/spv/5e4589a1.vert.spv | Bin 0 -> 7988 bytes .../shaders/spv/a0f2dbac.frag.spv | Bin 0 -> 100348 bytes .../shaders/spv/a0f2dbac.vert.spv | Bin 0 -> 7988 bytes .../shaders/spv/f2952361.frag.spv | Bin 0 -> 102216 bytes .../shaders/spv/f2952361.vert.spv | Bin 0 -> 7988 bytes .../ludic.render3d/shaders/spv/manifest.txt | 204 ++++++++++++++++++ packages/ludic.render3d/shaders/terrain.frag | 20 +- packages/ludic.render3d/shaders/variants.list | 3 + packages/ludic.render3d/terrain.ludic | 18 +- 10 files changed, 240 insertions(+), 5 deletions(-) create mode 100644 packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv create mode 100644 packages/ludic.render3d/shaders/spv/5e4589a1.vert.spv create mode 100644 packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv create mode 100644 packages/ludic.render3d/shaders/spv/a0f2dbac.vert.spv create mode 100644 packages/ludic.render3d/shaders/spv/f2952361.frag.spv create mode 100644 packages/ludic.render3d/shaders/spv/f2952361.vert.spv diff --git a/packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv b/packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..332dad05495a0306fd6c19b413003d44dca32f4d GIT binary patch literal 100348 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 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/5e4589a1.vert.spv b/packages/ludic.render3d/shaders/spv/5e4589a1.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..7051758fe160bee276d12aeb800f612c5c42e0e2 GIT binary patch literal 7988 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 D7SFW8 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv b/packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..cbe9a3c42f79126ffd1e59126a4da57476d04697 GIT binary patch literal 100348 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 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/a0f2dbac.vert.spv b/packages/ludic.render3d/shaders/spv/a0f2dbac.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..7051758fe160bee276d12aeb800f612c5c42e0e2 GIT binary patch literal 7988 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 D7SFW8 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/f2952361.frag.spv b/packages/ludic.render3d/shaders/spv/f2952361.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..3ac120b348bc8758e5a90e8f857d863760fccaee GIT binary patch literal 102216 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 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/f2952361.vert.spv b/packages/ludic.render3d/shaders/spv/f2952361.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..7051758fe160bee276d12aeb800f612c5c42e0e2 GIT binary patch literal 7988 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 D7SFW8 literal 0 HcmV?d00001 diff --git a/packages/ludic.render3d/shaders/spv/manifest.txt b/packages/ludic.render3d/shaders/spv/manifest.txt index 3d564e5d..cfa52ef1 100644 --- a/packages/ludic.render3d/shaders/spv/manifest.txt +++ b/packages/ludic.render3d/shaders/spv/manifest.txt @@ -2324,6 +2324,210 @@ T f4382918 u_snow_d 15 T f4382918 u_sunshadow 16 T f4382918 u_tershadow 17 T f4382918 u_ts_height 18 +P f2952361 terrain.vert terrain.frag #define SUN_INLINE; +B f2952361 vert 0 204 +U f2952361 vert u_half 0 float 1 0 +U f2952361 vert u_view 16 mat4 1 0 +U f2952361 vert u_proj 80 mat4 1 0 +U f2952361 vert u_origin 144 vec2 1 0 +U f2952361 vert u_cam_pos 160 vec3 1 0 +U f2952361 vert u_node 176 vec3 1 0 +U f2952361 vert u_morph 192 vec2 1 0 +U f2952361 vert u_grid 200 float 1 0 +I f2952361 a_xz 0 vec2 +B f2952361 frag 1 872 +U f2952361 frag u_cascade_vp 0 mat4 5 64 +U f2952361 frag u_cascade_split 320 float 5 16 +U f2952361 frag u_cascade_range 400 float 5 16 +U f2952361 frag u_cascade_texel 480 float 5 16 +U f2952361 frag u_sun_dir 560 vec3 1 0 +U f2952361 frag u_sun_color 576 vec3 1 0 +U f2952361 frag u_cam_pos 592 vec3 1 0 +U f2952361 frag u_prefilter_levels 604 float 1 0 +U f2952361 frag u_fog_density 608 float 1 0 +U f2952361 frag u_fog_height_falloff 612 float 1 0 +U f2952361 frag u_fog_base 616 float 1 0 +U f2952361 frag u_clip_y 620 float 1 0 +U f2952361 frag u_spec_scale 624 float 1 0 +U f2952361 frag u_sky_rot 632 vec2 1 0 +U f2952361 frag u_ibl_scale 640 vec3 1 0 +U f2952361 frag u_daylight 652 float 1 0 +U f2952361 frag u_fire_pos 656 vec3 1 0 +U f2952361 frag u_fire_color 672 vec3 1 0 +U f2952361 frag u_hand_pos 688 vec3 1 0 +U f2952361 frag u_hand_color 704 vec3 1 0 +U f2952361 frag u_hand_dir 720 vec3 1 0 +U f2952361 frag u_hand_cone 732 float 1 0 +U f2952361 frag u_ts_origin 736 vec2 1 0 +U f2952361 frag u_ts_half 744 float 1 0 +U f2952361 frag u_ts_on 748 float 1 0 +U f2952361 frag u_force_cascade 752 int 1 0 +U f2952361 frag u_cloud_shadow 756 float 1 0 +U f2952361 frag u_time 760 float 1 0 +U f2952361 frag u_half 764 float 1 0 +U f2952361 frag u_texel 768 float 1 0 +U f2952361 frag u_ortho_on 772 float 1 0 +U f2952361 frag u_carpet_on 776 float 1 0 +U f2952361 frag u_snow_line 780 float 1 0 +U f2952361 frag u_lake_level 784 float 1 0 +U f2952361 frag u_sea_level 788 float 1 0 +U f2952361 frag u_origin 792 vec2 1 0 +U f2952361 frag u_view 800 mat4 1 0 +U f2952361 frag u_far_split 864 float 1 0 +U f2952361 frag u_far_band 868 float 1 0 +T f2952361 u_brdf 2 +T f2952361 u_carpet 3 +T f2952361 u_grass_a 4 +T f2952361 u_grass_d 5 +T f2952361 u_grass_n 6 +T f2952361 u_height 7 +T f2952361 u_irradiance 8 +T f2952361 u_ortho 9 +T f2952361 u_prefilter 10 +T f2952361 u_rock_a 11 +T f2952361 u_rock_d 12 +T f2952361 u_rock_n 13 +T f2952361 u_shadow 14 +T f2952361 u_snow_d 15 +T f2952361 u_sunshadow 16 +T f2952361 u_tershadow 17 +T f2952361 u_ts_height 18 +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 +U a0f2dbac vert u_view 16 mat4 1 0 +U a0f2dbac vert u_proj 80 mat4 1 0 +U a0f2dbac vert u_origin 144 vec2 1 0 +U a0f2dbac vert u_cam_pos 160 vec3 1 0 +U a0f2dbac vert u_node 176 vec3 1 0 +U a0f2dbac vert u_morph 192 vec2 1 0 +U a0f2dbac vert u_grid 200 float 1 0 +I a0f2dbac a_xz 0 vec2 +B a0f2dbac frag 1 872 +U a0f2dbac frag u_cascade_vp 0 mat4 5 64 +U a0f2dbac frag u_cascade_split 320 float 5 16 +U a0f2dbac frag u_cascade_range 400 float 5 16 +U a0f2dbac frag u_cascade_texel 480 float 5 16 +U a0f2dbac frag u_sun_dir 560 vec3 1 0 +U a0f2dbac frag u_sun_color 576 vec3 1 0 +U a0f2dbac frag u_cam_pos 592 vec3 1 0 +U a0f2dbac frag u_prefilter_levels 604 float 1 0 +U a0f2dbac frag u_fog_density 608 float 1 0 +U a0f2dbac frag u_fog_height_falloff 612 float 1 0 +U a0f2dbac frag u_fog_base 616 float 1 0 +U a0f2dbac frag u_clip_y 620 float 1 0 +U a0f2dbac frag u_spec_scale 624 float 1 0 +U a0f2dbac frag u_sky_rot 632 vec2 1 0 +U a0f2dbac frag u_ibl_scale 640 vec3 1 0 +U a0f2dbac frag u_daylight 652 float 1 0 +U a0f2dbac frag u_fire_pos 656 vec3 1 0 +U a0f2dbac frag u_fire_color 672 vec3 1 0 +U a0f2dbac frag u_hand_pos 688 vec3 1 0 +U a0f2dbac frag u_hand_color 704 vec3 1 0 +U a0f2dbac frag u_hand_dir 720 vec3 1 0 +U a0f2dbac frag u_hand_cone 732 float 1 0 +U a0f2dbac frag u_ts_origin 736 vec2 1 0 +U a0f2dbac frag u_ts_half 744 float 1 0 +U a0f2dbac frag u_ts_on 748 float 1 0 +U a0f2dbac frag u_force_cascade 752 int 1 0 +U a0f2dbac frag u_cloud_shadow 756 float 1 0 +U a0f2dbac frag u_time 760 float 1 0 +U a0f2dbac frag u_half 764 float 1 0 +U a0f2dbac frag u_texel 768 float 1 0 +U a0f2dbac frag u_ortho_on 772 float 1 0 +U a0f2dbac frag u_carpet_on 776 float 1 0 +U a0f2dbac frag u_snow_line 780 float 1 0 +U a0f2dbac frag u_lake_level 784 float 1 0 +U a0f2dbac frag u_sea_level 788 float 1 0 +U a0f2dbac frag u_origin 792 vec2 1 0 +U a0f2dbac frag u_view 800 mat4 1 0 +U a0f2dbac frag u_far_split 864 float 1 0 +U a0f2dbac frag u_far_band 868 float 1 0 +T a0f2dbac u_brdf 2 +T a0f2dbac u_carpet 3 +T a0f2dbac u_grass_a 4 +T a0f2dbac u_grass_d 5 +T a0f2dbac u_grass_n 6 +T a0f2dbac u_height 7 +T a0f2dbac u_irradiance 8 +T a0f2dbac u_ortho 9 +T a0f2dbac u_prefilter 10 +T a0f2dbac u_rock_a 11 +T a0f2dbac u_rock_d 12 +T a0f2dbac u_rock_n 13 +T a0f2dbac u_shadow 14 +T a0f2dbac u_snow_d 15 +T a0f2dbac u_sunshadow 16 +T a0f2dbac u_tershadow 17 +T a0f2dbac u_ts_height 18 +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 +U 5e4589a1 vert u_view 16 mat4 1 0 +U 5e4589a1 vert u_proj 80 mat4 1 0 +U 5e4589a1 vert u_origin 144 vec2 1 0 +U 5e4589a1 vert u_cam_pos 160 vec3 1 0 +U 5e4589a1 vert u_node 176 vec3 1 0 +U 5e4589a1 vert u_morph 192 vec2 1 0 +U 5e4589a1 vert u_grid 200 float 1 0 +I 5e4589a1 a_xz 0 vec2 +B 5e4589a1 frag 1 872 +U 5e4589a1 frag u_cascade_vp 0 mat4 5 64 +U 5e4589a1 frag u_cascade_split 320 float 5 16 +U 5e4589a1 frag u_cascade_range 400 float 5 16 +U 5e4589a1 frag u_cascade_texel 480 float 5 16 +U 5e4589a1 frag u_sun_dir 560 vec3 1 0 +U 5e4589a1 frag u_sun_color 576 vec3 1 0 +U 5e4589a1 frag u_cam_pos 592 vec3 1 0 +U 5e4589a1 frag u_prefilter_levels 604 float 1 0 +U 5e4589a1 frag u_fog_density 608 float 1 0 +U 5e4589a1 frag u_fog_height_falloff 612 float 1 0 +U 5e4589a1 frag u_fog_base 616 float 1 0 +U 5e4589a1 frag u_clip_y 620 float 1 0 +U 5e4589a1 frag u_spec_scale 624 float 1 0 +U 5e4589a1 frag u_sky_rot 632 vec2 1 0 +U 5e4589a1 frag u_ibl_scale 640 vec3 1 0 +U 5e4589a1 frag u_daylight 652 float 1 0 +U 5e4589a1 frag u_fire_pos 656 vec3 1 0 +U 5e4589a1 frag u_fire_color 672 vec3 1 0 +U 5e4589a1 frag u_hand_pos 688 vec3 1 0 +U 5e4589a1 frag u_hand_color 704 vec3 1 0 +U 5e4589a1 frag u_hand_dir 720 vec3 1 0 +U 5e4589a1 frag u_hand_cone 732 float 1 0 +U 5e4589a1 frag u_ts_origin 736 vec2 1 0 +U 5e4589a1 frag u_ts_half 744 float 1 0 +U 5e4589a1 frag u_ts_on 748 float 1 0 +U 5e4589a1 frag u_force_cascade 752 int 1 0 +U 5e4589a1 frag u_cloud_shadow 756 float 1 0 +U 5e4589a1 frag u_time 760 float 1 0 +U 5e4589a1 frag u_half 764 float 1 0 +U 5e4589a1 frag u_texel 768 float 1 0 +U 5e4589a1 frag u_ortho_on 772 float 1 0 +U 5e4589a1 frag u_carpet_on 776 float 1 0 +U 5e4589a1 frag u_snow_line 780 float 1 0 +U 5e4589a1 frag u_lake_level 784 float 1 0 +U 5e4589a1 frag u_sea_level 788 float 1 0 +U 5e4589a1 frag u_origin 792 vec2 1 0 +U 5e4589a1 frag u_view 800 mat4 1 0 +U 5e4589a1 frag u_far_split 864 float 1 0 +U 5e4589a1 frag u_far_band 868 float 1 0 +T 5e4589a1 u_brdf 2 +T 5e4589a1 u_carpet 3 +T 5e4589a1 u_grass_a 4 +T 5e4589a1 u_grass_d 5 +T 5e4589a1 u_grass_n 6 +T 5e4589a1 u_height 7 +T 5e4589a1 u_irradiance 8 +T 5e4589a1 u_ortho 9 +T 5e4589a1 u_prefilter 10 +T 5e4589a1 u_rock_a 11 +T 5e4589a1 u_rock_d 12 +T 5e4589a1 u_rock_n 13 +T 5e4589a1 u_shadow 14 +T 5e4589a1 u_snow_d 15 +T 5e4589a1 u_sunshadow 16 +T 5e4589a1 u_tershadow 17 +T 5e4589a1 u_ts_height 18 P bf3151c8 terrain.vert tersun.frag B bf3151c8 vert 0 204 U bf3151c8 vert u_half 0 float 1 0 diff --git a/packages/ludic.render3d/shaders/terrain.frag b/packages/ludic.render3d/shaders/terrain.frag index d98afcca..f3cecb1d 100644 --- a/packages/ludic.render3d/shaders/terrain.frag +++ b/packages/ludic.render3d/shaders/terrain.frag @@ -200,6 +200,20 @@ void triC(bool cheap, sampler2D d, sampler2D nm, sampler2D am, vec3 p, vec3 dpx, if (cheap) { samplePlain(d, nm, am, p.xz * scale, dpx.xz * scale, dpy.xz * scale, alb, nrm, arm); nrm = normalize(vec3(nrm.x, 1.0, nrm.y) + vec3(0.0, 1e-3, 0.0)); } else sampleTri(d, nm, am, p, dpx, dpy, n, scale, alb, nrm, arm); } +#ifdef SUN_INLINE +// Vulkan: the cascades are read here, in the ground's own shader, and tersun.frag's pass - a second +// rasterisation of every patch - is not drawn. The cliff tersun.frag describes is OpenGL's driver, and +// OpenGL keeps that pass. The same normal, the same two tiers and the same cross-fade as tersun.frag. +uniform float u_far_split; +uniform float u_far_band; +float sunInline(vec3 p, float dist, float viewDepth) { + vec3 Ng = normalize(texture(u_height, v_huv).gba); + if (dist > u_far_split + u_far_band) return sunShadowCheap(p, Ng, viewDepth); + if (dist < u_far_split - u_far_band) return sunShadow(p, Ng, viewDepth); + return mix(sunShadow(p, Ng, viewDepth), sunShadowCheap(p, Ng, viewDepth), + smoothstep(u_far_split - u_far_band, u_far_split + u_far_band, dist)); +} +#endif vec3 groundShade(vec3 p, vec3 N, float slope, float dist, float viewDepth, bool cheap) { // ---- material weights ---- float macro = fbmC(cheap, p.xz * 0.02, 2); @@ -411,9 +425,11 @@ vec3 groundShade(vec3 p, vec3 N, float slope, float dist, float viewDepth, bool // ground's own relief is in the baked height-field shadow that sunShadow() applies #ifdef TFAST_1 float shadow = 1.0; +#elif defined(SUN_INLINE) + float shadow = sunInline(p, dist, viewDepth); #else // tersun.frag computed this for exactly this pixel; see the note there for why the - // cascade read cannot happen in here. + // cascade read cannot happen in here (on OpenGL). float shadow = texelFetch(u_sunshadow, ivec2(gl_FragCoord.xy), 0).r; #endif vec3 col = shade(p, n, alb, rough, metal, ao, shadow, viewDepth); @@ -421,8 +437,10 @@ vec3 groundShade(vec3 p, vec3 N, float slope, float dist, float viewDepth, bool return col; } +#ifndef SUN_INLINE uniform float u_far_split; uniform float u_far_band; +#endif void main() { vec3 p = v_wpos; if (p.y < u_clip_y) discard; diff --git a/packages/ludic.render3d/shaders/variants.list b/packages/ludic.render3d/shaders/variants.list index 64674722..5ac3cca9 100644 --- a/packages/ludic.render3d/shaders/variants.list +++ b/packages/ludic.render3d/shaders/variants.list @@ -46,5 +46,8 @@ skin.vert|shadow.frag|#define SHADOW_PASS;#define ALPHA_TEST; terrain.vert|terrain.frag| terrain.vert|terrain.frag|#define FAR_ONLY; terrain.vert|terrain.frag|#define NEAR_ONLY; +terrain.vert|terrain.frag|#define SUN_INLINE; +terrain.vert|terrain.frag|#define SUN_INLINE;#define FAR_ONLY; +terrain.vert|terrain.frag|#define SUN_INLINE;#define NEAR_ONLY; terrain.vert|tersun.frag| water.vert|water.frag| diff --git a/packages/ludic.render3d/terrain.ludic b/packages/ludic.render3d/terrain.ludic index f5efdd15..9d7da8c7 100644 --- a/packages/ludic.render3d/terrain.ludic +++ b/packages/ludic.render3d/terrain.ludic @@ -32,6 +32,7 @@ var ter_prog: int = 0 var ter_prog_far: int = 0 var ter_prog_near: int = 0 # the detailed tier alone (NEAR_ONLY) var ter_sun_prog: int = 0 # tersun.frag: sun visibility into a screen buffer +var ter_sun_inline: bool = false # the ground's shader reads the cascades itself (Vulkan); no sun pass var ter_sun_tgt: Target = null # that buffer, at the frame's size var ter_sun_refl: Target = null # and at the reflection's, which is smaller var ter_sun_dumped: bool = false @@ -423,6 +424,11 @@ function terrain_init_finish() -> void { # draw every patch with one tier's program (what each tier costs over a whole frame); # R3D_NOSPLIT goes back to the single program that holds both tiers. if Os.has_env("R3D_TFAST") { defs = defs + "#define TFAST_" + Os.env("R3D_TFAST") + "\n" } + # Vulkan reads the cascades inside the ground's own shader and draws no separate sun pass + # (terrain.frag, SUN_INLINE): one rasterisation of the patches instead of two, in the frame and in + # the reflection. R3D_SUN_PASS=1 keeps the pass there too, for comparing. + ter_sun_inline = gpu_kind == GPU_VK and not Os.has_env("R3D_SUN_PASS") + if ter_sun_inline { defs = defs + "#define SUN_INLINE\n" } ter_prog = r3d_program("terrain.vert", "terrain.frag", defs) ter_prog_far = r3d_program("terrain.vert", "terrain.frag", defs + "#define FAR_ONLY\n") ter_prog_near = r3d_program("terrain.vert", "terrain.frag", defs + "#define NEAR_ONLY\n") @@ -487,9 +493,12 @@ function terrain_bind_prog(p: int) -> void { # The ground reads its sun visibility out of the buffer tersun.frag filled, and has no # use for the cascade array shadow_bind just put on this unit; leaving both bound under # one unit is undefined ground, so the array comes off first. - gpu_tex_unit(15) - gpu_tex_bind(GPU_TEX2D_ARRAY, 0) - r3d_bind_2d(p, "u_sunshadow", 15, ter_sun_tex) + # (With the read inline, the array shadow_bind put there is exactly what the ground wants.) + if not ter_sun_inline { + gpu_tex_unit(15) + gpu_tex_bind(GPU_TEX2D_ARRAY, 0) + r3d_bind_2d(p, "u_sunshadow", 15, ter_sun_tex) + } } # The visibility buffer for the size being drawn into. The reflection is rendered at its @@ -559,6 +568,7 @@ function terrain_sun_pass(w: int, h: int, depth: int) -> Target { } function terrain_sun_prepare() -> void { + if ter_sun_inline { return } ter_sun_tex = terrain_sun_pass(post_w, post_h, post_hdr.depth).color ter_sun_done = true } @@ -571,7 +581,7 @@ function terrain_draw() -> void { var vw = post_w var vh = post_h if ter_reflect { vw = water_refl.w; vh = water_refl.h } - if not ter_sun_done { + if not ter_sun_done and not ter_sun_inline { var dep = post_hdr.depth if ter_reflect { dep = water_refl.depth } ter_sun_tex = terrain_sun_pass(vw, vh, dep).color