diff --git a/armorlab/sources/make_mesh.ts b/armorlab/sources/make_mesh.ts index add3f76f..51459b3b 100644 --- a/armorlab/sources/make_mesh.ts +++ b/armorlab/sources/make_mesh.ts @@ -86,6 +86,11 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { node_shader_add_texture(kong, "senvmap_brdf", "$brdf.k"); node_shader_add_texture(kong, "senvmap_radiance", "_envmap_radiance"); + node_shader_add_texture(kong, "senvmap_radiance0", "_envmap_radiance0"); + node_shader_add_texture(kong, "senvmap_radiance1", "_envmap_radiance1"); + node_shader_add_texture(kong, "senvmap_radiance2", "_envmap_radiance2"); + node_shader_add_texture(kong, "senvmap_radiance3", "_envmap_radiance3"); + node_shader_add_texture(kong, "senvmap_radiance4", "_envmap_radiance4"); } node_shader_add_texture(kong, "texpaint"); @@ -140,9 +145,21 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_add_constant(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); node_shader_add_constant(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); - node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); + node_shader_add_function(kong, str_envmap_equirect); - node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, sampler_linear, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + // node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); + // node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, sampler_linear, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + + node_shader_add_function(kong, str_envmap_sample); + node_shader_write_frag(kong, "var envlod: float = roughness * 5.0;"); + node_shader_write_frag(kong, "var lod0: float = floor(envlod);"); + node_shader_write_frag(kong, "var lod1: float = ceil(envlod);"); + node_shader_write_frag(kong, "var lodf: float = envlod - lod0;"); + node_shader_write_frag(kong, "var envmap_coord: float2 = envmap_equirect(wreflect, constants.envmap_data.x);"); + node_shader_write_frag(kong, "var lodc0: float3 = envmap_sample(lod0, envmap_coord);"); + node_shader_write_frag(kong, "var lodc1: float3 = envmap_sample(lod1, envmap_coord);"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = lerp3(lodc0, lodc1, lodf);"); + // node_shader_add_constant(kong, "shirr: float4[7]", "_envmap_irradiance"); node_shader_add_constant(kong, "shirr0: float4", "_envmap_irradiance0"); node_shader_add_constant(kong, "shirr1: float4", "_envmap_irradiance1"); diff --git a/armorpaint/sources/make_mesh.ts b/armorpaint/sources/make_mesh.ts index 94cce1eb..13617894 100644 --- a/armorpaint/sources/make_mesh.ts +++ b/armorpaint/sources/make_mesh.ts @@ -147,9 +147,14 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte } if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) { - texture_count += 2; + texture_count += 7; node_shader_add_texture(kong, "senvmap_brdf", "$brdf.k"); node_shader_add_texture(kong, "senvmap_radiance", "_envmap_radiance"); + node_shader_add_texture(kong, "senvmap_radiance0", "_envmap_radiance0"); + node_shader_add_texture(kong, "senvmap_radiance1", "_envmap_radiance1"); + node_shader_add_texture(kong, "senvmap_radiance2", "_envmap_radiance2"); + node_shader_add_texture(kong, "senvmap_radiance3", "_envmap_radiance3"); + node_shader_add_texture(kong, "senvmap_radiance4", "_envmap_radiance4"); } // Get layers for this pass @@ -372,12 +377,24 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_write_frag(kong, "var dotnv: float = max(0.0, dot(n, vvec));"); // node_shader_write_frag(kong, "var env_brdf: float2 = senvmap_brdf[uint2(float2(roughness, 1.0 - dotnv) * 256.0)].xy;"); node_shader_write_frag(kong, "var env_brdf: float4 = senvmap_brdf[uint2(float2(roughness, 1.0 - dotnv) * 256.0)];"); - node_shader_add_constant(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); + // node_shader_add_constant(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); node_shader_add_constant(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); - node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); + node_shader_add_function(kong, str_envmap_equirect); - node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, sampler_linear, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + // node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); + // node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, sampler_linear, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + + node_shader_add_function(kong, str_envmap_sample); + node_shader_write_frag(kong, "var envlod: float = roughness * 5.0;"); + node_shader_write_frag(kong, "var lod0: float = floor(envlod);"); + node_shader_write_frag(kong, "var lod1: float = ceil(envlod);"); + node_shader_write_frag(kong, "var lodf: float = envlod - lod0;"); + node_shader_write_frag(kong, "var envmap_coord: float2 = envmap_equirect(wreflect, constants.envmap_data.x);"); + node_shader_write_frag(kong, "var lodc0: float3 = envmap_sample(lod0, envmap_coord);"); + node_shader_write_frag(kong, "var lodc1: float3 = envmap_sample(lod1, envmap_coord);"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = lerp3(lodc0, lodc1, lodf);"); + // node_shader_add_constant(kong, "shirr: float4[7]", "_envmap_irradiance"); node_shader_add_constant(kong, "shirr0: float4", "_envmap_irradiance0"); node_shader_add_constant(kong, "shirr1: float4", "_envmap_irradiance1"); diff --git a/armorsculpt/sources/make_mesh.ts b/armorsculpt/sources/make_mesh.ts index 100ef58a..1ee73261 100644 --- a/armorsculpt/sources/make_mesh.ts +++ b/armorsculpt/sources/make_mesh.ts @@ -114,6 +114,11 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte texture_count += 2; node_shader_add_texture(kong, "senvmap_brdf", "$brdf.k"); node_shader_add_texture(kong, "senvmap_radiance", "_envmap_radiance"); + node_shader_add_texture(kong, "senvmap_radiance0", "_envmap_radiance0"); + node_shader_add_texture(kong, "senvmap_radiance1", "_envmap_radiance1"); + node_shader_add_texture(kong, "senvmap_radiance2", "_envmap_radiance2"); + node_shader_add_texture(kong, "senvmap_radiance3", "_envmap_radiance3"); + node_shader_add_texture(kong, "senvmap_radiance4", "_envmap_radiance4"); } // Get layers for this pass @@ -268,9 +273,21 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte node_shader_add_constant(kong, "envmap_num_mipmaps: int", "_envmap_num_mipmaps"); node_shader_add_constant(kong, "envmap_data: float4", "_envmap_data"); // angle, sin(angle), cos(angle), strength node_shader_write_frag(kong, "var wreflect: float3 = reflect(-vvec, n);"); - node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); + node_shader_add_function(kong, str_envmap_equirect); - node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, sampler_linear, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + // node_shader_write_frag(kong, "var envlod: float = roughness * float(constants.envmap_num_mipmaps);"); + // node_shader_write_frag(kong, "var prefiltered_color: float3 = sample_lod(senvmap_radiance, sampler_linear, envmap_equirect(wreflect, constants.envmap_data.x), envlod).rgb;"); + + node_shader_add_function(kong, str_envmap_sample); + node_shader_write_frag(kong, "var envlod: float = roughness * 5.0;"); + node_shader_write_frag(kong, "var lod0: float = floor(envlod);"); + node_shader_write_frag(kong, "var lod1: float = ceil(envlod);"); + node_shader_write_frag(kong, "var lodf: float = envlod - lod0;"); + node_shader_write_frag(kong, "var envmap_coord: float2 = envmap_equirect(wreflect, constants.envmap_data.x);"); + node_shader_write_frag(kong, "var lodc0: float3 = envmap_sample(lod0, envmap_coord);"); + node_shader_write_frag(kong, "var lodc1: float3 = envmap_sample(lod1, envmap_coord);"); + node_shader_write_frag(kong, "var prefiltered_color: float3 = lerp3(lodc0, lodc1, lodf);"); + // node_shader_add_constant(kong, "shirr: float4[7]", "_envmap_irradiance"); node_shader_add_constant(kong, "shirr0: float4", "_envmap_irradiance0"); node_shader_add_constant(kong, "shirr1: float4", "_envmap_irradiance1"); diff --git a/base/assets/Scene.arm b/base/assets/Scene.arm index 0979d798..74bae26e 100644 Binary files a/base/assets/Scene.arm and b/base/assets/Scene.arm differ diff --git a/base/assets/World_radiance_5.hdr b/base/assets/World_radiance_5.hdr deleted file mode 100644 index 1835baa8..00000000 Binary files a/base/assets/World_radiance_5.hdr and /dev/null differ diff --git a/base/assets/World_radiance_6.hdr b/base/assets/World_radiance_6.hdr deleted file mode 100644 index 3965bfd8..00000000 --- a/base/assets/World_radiance_6.hdr +++ /dev/null @@ -1,6 +0,0 @@ -#?RADIANCE -# Made with Adobe Photoshop -FORMAT=32-bit_rle_rgbe - --Y 2 +X 4 -–…w~€†“€„�zh~öÕÂ}ÊÊÒ~¿¹¸~ëÈ´} \ No newline at end of file diff --git a/base/assets/World_radiance_7.hdr b/base/assets/World_radiance_7.hdr deleted file mode 100644 index 87d885cd..00000000 --- a/base/assets/World_radiance_7.hdr +++ /dev/null @@ -1,6 +0,0 @@ -#?RADIANCE -# Made with Adobe Photoshop -FORMAT=32-bit_rle_rgbe - --Y 1 +X 2 -¿¿~¿¿~ \ No newline at end of file diff --git a/base/assets/World_radiance_8.hdr b/base/assets/World_radiance_8.hdr deleted file mode 100644 index da93c866..00000000 --- a/base/assets/World_radiance_8.hdr +++ /dev/null @@ -1,6 +0,0 @@ -#?RADIANCE -# Made with Adobe Photoshop -FORMAT=32-bit_rle_rgbe - --Y 1 +X 1 -¿¿~ \ No newline at end of file diff --git a/base/assets/shader_datas.arm b/base/assets/shader_datas.arm index 51f92a5c..918866cb 100644 Binary files a/base/assets/shader_datas.arm and b/base/assets/shader_datas.arm differ diff --git a/base/shaders/deferred_light.kong b/base/shaders/deferred_light.kong index 88b7705b..30cb2c9d 100644 --- a/base/shaders/deferred_light.kong +++ b/base/shaders/deferred_light.kong @@ -34,6 +34,21 @@ const senvmap_brdf: tex2d; #[set(everything)] const senvmap_radiance: tex2d; +#[set(everything)] +const senvmap_radiance0: tex2d; + +#[set(everything)] +const senvmap_radiance1: tex2d; + +#[set(everything)] +const senvmap_radiance2: tex2d; + +#[set(everything)] +const senvmap_radiance3: tex2d; + +#[set(everything)] +const senvmap_radiance4: tex2d; + #[set(everything)] const ssaotex: tex2d; @@ -167,6 +182,25 @@ fun envmap_equirect(normal: float3, angle: float): float2 { return float2(theta / PI2, phi / PI); } +fun envmap_sample(lod: float, coord: float2): float3 { + if (lod == 0.0) { + return sample_lod(senvmap_radiance, sampler_linear, coord, 0.0).rgb; + } + if (lod == 1.0) { + return sample_lod(senvmap_radiance0, sampler_linear, coord, 0.0).rgb; + } + if (lod == 2.0) { + return sample_lod(senvmap_radiance1, sampler_linear, coord, 0.0).rgb; + } + if (lod == 3.0) { + return sample_lod(senvmap_radiance2, sampler_linear, coord, 0.0).rgb; + } + if (lod == 4.0) { + return sample_lod(senvmap_radiance3, sampler_linear, coord, 0.0).rgb; + } + return sample_lod(senvmap_radiance4, sampler_linear, coord, 0.0).rgb; +} + fun deferred_light_frag(input: vert_out): float4 { // normal.xy, roughness, metallic/matid var g0: float4 = sample_lod(gbuffer0, sampler_linear, input.tex, 0.0); @@ -217,8 +251,18 @@ fun deferred_light_frag(input: vert_out): float4 { envl = envl / PI; var reflection_world: float3 = reflect(-v, n); - var lod: float = mip_from_roughness(roughness, float(constants.envmap_num_mipmaps)); - var prefiltered_color: float3 = sample_lod(senvmap_radiance, sampler_linear, envmap_equirect(reflection_world, constants.envmap_data.x), lod).rgb; + + // var lod: float = mip_from_roughness(roughness, float(constants.envmap_num_mipmaps)); + // var prefiltered_color: float3 = sample_lod(senvmap_radiance, sampler_linear, envmap_equirect(reflection_world, constants.envmap_data.x), lod).rgb; + + var lod: float = mip_from_roughness(roughness, 5.0); + var lod0: float = floor(lod); + var lod1: float = ceil(lod); + var lodf: float = lod - lod0; + var envmap_coord: float2 = envmap_equirect(reflection_world, constants.envmap_data.x); + var lodc0: float3 = envmap_sample(lod0, envmap_coord); + var lodc1: float3 = envmap_sample(lod1, envmap_coord); + var prefiltered_color: float3 = lerp3(lodc0, lodc1, lodf); envl.rgb = envl.rgb * albedo; // Indirect specular diff --git a/base/sources/ts/iron/uniforms.ts b/base/sources/ts/iron/uniforms.ts index 7d0487aa..1bcb102c 100644 --- a/base/sources/ts/iron/uniforms.ts +++ b/base/sources/ts/iron/uniforms.ts @@ -53,6 +53,36 @@ function uniforms_set_context_consts(context: shader_context_t, bind_params: str gpu_set_texture(context._.tex_units[j], w._.radiance); } } + else if (tulink == "_envmap_radiance0") { + let w: world_data_t = scene_world; + if (w != null) { + gpu_set_texture(context._.tex_units[j], w._.radiance_mipmaps[0]); + } + } + else if (tulink == "_envmap_radiance1") { + let w: world_data_t = scene_world; + if (w != null) { + gpu_set_texture(context._.tex_units[j], w._.radiance_mipmaps[1]); + } + } + else if (tulink == "_envmap_radiance2") { + let w: world_data_t = scene_world; + if (w != null) { + gpu_set_texture(context._.tex_units[j], w._.radiance_mipmaps[2]); + } + } + else if (tulink == "_envmap_radiance3") { + let w: world_data_t = scene_world; + if (w != null) { + gpu_set_texture(context._.tex_units[j], w._.radiance_mipmaps[3]); + } + } + else if (tulink == "_envmap_radiance4") { + let w: world_data_t = scene_world; + if (w != null) { + gpu_set_texture(context._.tex_units[j], w._.radiance_mipmaps[4]); + } + } else if (tulink == "_envmap") { let w: world_data_t = scene_world; if (w != null) { diff --git a/base/sources/ts/strings.ts b/base/sources/ts/strings.ts index 4c1e591e..396f3d63 100644 --- a/base/sources/ts/strings.ts +++ b/base/sources/ts/strings.ts @@ -360,6 +360,27 @@ fun envmap_equirect(normal: float3, angle: float): float2 { \ } \ "; +let str_envmap_sample: string = "\ +fun envmap_sample(lod: float, coord: float2): float3 { \ + if (lod == 0.0) { \ + return sample_lod(senvmap_radiance, sampler_linear, coord, 0.0).rgb; \ + } \ + if (lod == 1.0) { \ + return sample_lod(senvmap_radiance0, sampler_linear, coord, 0.0).rgb; \ + } \ + if (lod == 2.0) { \ + return sample_lod(senvmap_radiance1, sampler_linear, coord, 0.0).rgb; \ + } \ + if (lod == 3.0) { \ + return sample_lod(senvmap_radiance2, sampler_linear, coord, 0.0).rgb; \ + } \ + if (lod == 4.0) { \ + return sample_lod(senvmap_radiance3, sampler_linear, coord, 0.0).rgb; \ + } \ + return sample_lod(senvmap_radiance4, sampler_linear, coord, 0.0).rgb; \ +} \ +"; + let str_get_pos_nor_from_depth: string = "\ fun get_pos_from_depth(uv: float2, invVP: flaot4x4): float3 { \ var depth: float = sample_lod(gbufferD, sampler_linear, float2(uv.x, 1.0 - uv.y), 0.0).r; \