diff --git a/README.md b/README.md index da2c402..d8226c3 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,13 @@ Notable changes/additions compared to Bliss unstable: + Additional cirrus & cumulonimbus cloud layers (WIP) + Distant Horizons chunk fading + Moon Texture with phases - + Improved Puddles, Snow Overlay and Rain Ripples + + Snow Overlay and Rain Ripples + Better mod support + Better shader-side (hardcoded) emissives + Lightsource with shadows on the main end island + Rain & thunder cloud coverage and daily weather + Much better lightning strikes with clouds lighting up and shadows - + Rainbows + + Aurora & Rainbow + Caelum (Arda Craft) support + Emissive Ores @@ -65,15 +65,8 @@ Note: With default settings there is at least one guaranteed eclipse per ingame ### [You can contact me by joining Xonk's discord server and using the Eclipse channel!](https://discord.gg/8nVt56H9zH) -# IN-DEVELOPMENT VERSIONS AND RELEASE VERSIONS -`Unstable` are the very latest versions, and are released regularly to be tested by anyone. **Please report any issues you find.** -`Release versions` are uploaded when the in-development version is stable enough, and has enough changes to warrant a release. These are the versions uploaded to Modrinth or Curseforge. The release versions are not the very latest version. -### Download the latest `Unstable` version: +# How to download the latest version: - locate the `green "code" button` on this page. this button is NOT in the `releases` page. - click the `green "code" button` and select `"download zip"`. - once the zip file finishes downloading, install it like a normal shader. you do NOT need to unzip/extract/decompress. -### Download the latest `Release` version: - - locate the `"Releases"` tab on the right side of this page. - - find the release version you want to download. locate the files attactched to it, and download the file named similar to `"Eclipse_(version)_chocapic13_shaders_edit.zip"` - - once the zip file finishes downloading, install it like a normal shader. you do NOT need to unzip/extract/decompress. diff --git a/shaders/block.properties b/shaders/block.properties index c4235f4..13a5494 100644 --- a/shaders/block.properties +++ b/shaders/block.properties @@ -672,7 +672,7 @@ block.265=betterend:iron_bulb_lantern_yellow betterend:terminite_bulb_lantern_ye humility-afm:led_yellow \ mcwlights:yellow_lamp:lit=true mcwlights:yellow_paper_lamp:lit=true mcwlights:yellow_ceiling_light:lit=true -block.266=sculk sculk_vein sculk_sensor sculk_catalyst calibrated_sculk_sensor sculk_shrieker +block.266=sculk sculk_sensor sculk_catalyst calibrated_sculk_sensor sculk_shrieker ####### ----- reflective translucents / glass ----- ####### @@ -1093,6 +1093,7 @@ block.495=cobblestone_wall:north=tall:east=low:south=tall:west=low:up=false ande block.496=cobblestone_wall:north=low:east=tall:south=low:west=tall:up=false andesite_wall:north=low:east=tall:south=low:west=tall:up=false blackstone_wall:north=low:east=tall:south=low:west=tall:up=false brick_wall:north=low:east=tall:south=low:west=tall:up=false cobbled_deepslate_wall:north=low:east=tall:south=low:west=tall:up=false deepslate_brick_wall:north=low:east=tall:south=low:west=tall:up=false deepslate_tile_wall:north=low:east=tall:south=low:west=tall:up=false diorite_wall:north=low:east=tall:south=low:west=tall:up=false end_stone_brick_wall:north=low:east=tall:south=low:west=tall:up=false granite_wall:north=low:east=tall:south=low:west=tall:up=false mossy_cobblestone_wall:north=low:east=tall:south=low:west=tall:up=false mossy_stone_brick_wall:north=low:east=tall:south=low:west=tall:up=false mud_brick_wall:north=low:east=tall:south=low:west=tall:up=false nether_brick_wall:north=low:east=tall:south=low:west=tall:up=false polished_blackstone_brick_wall:north=low:east=tall:south=low:west=tall:up=false polished_blackstone_wall:north=low:east=tall:south=low:west=tall:up=false polished_deepslate_wall:north=low:east=tall:south=low:west=tall:up=false prismarine_wall:north=low:east=tall:south=low:west=tall:up=false red_nether_brick_wall:north=low:east=tall:south=low:west=tall:up=false red_sandstone_wall:north=low:east=tall:south=low:west=tall:up=false sandstone_wall:north=low:east=tall:south=low:west=tall:up=false stone_brick_wall:north=low:east=tall:south=low:west=tall:up=false \ create:cut_andesite_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_andesite_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_andesite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_andesite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_asurine_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_asurine_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_asurine_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_asurine_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_calcite_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_calcite_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_calcite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_calcite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_crimsite_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_crimsite_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_crimsite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_crimsite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_deepslate_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_deepslate_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_deepslate_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_deepslate_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_diorite_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_diorite_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_diorite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_diorite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_dripstone_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_dripstone_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_dripstone_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_dripstone_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_granite_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_granite_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_granite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_granite_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_limestone_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_limestone_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_limestone_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_limestone_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_ochrum_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_ochrum_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_ochrum_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_ochrum_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_scorchia_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_scorchia_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_scorchia_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_scorchia_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_scoria_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_scoria_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_scoria_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_scoria_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_tuff_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_tuff_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_tuff_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_tuff_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_veridium_wall:north=low:east=tall:south=low:west=tall:up=false create:polished_cut_veridium_wall:north=low:east=tall:south=low:west=tall:up=false create:cut_veridium_brick_wall:north=low:east=tall:south=low:west=tall:up=false create:small_veridium_brick_wall:north=low:east=tall:south=low:west=tall:up=false +block.497=sculk_vein ####### ----- misc ----- ####### diff --git a/shaders/dimensions/DH_generic.fsh b/shaders/dimensions/DH_generic.fsh index c737d31..cac59ca 100644 --- a/shaders/dimensions/DH_generic.fsh +++ b/shaders/dimensions/DH_generic.fsh @@ -39,7 +39,7 @@ if (gl_FragCoord.x * texelSize.x < 1.0 && gl_FragCoord.y * texelSize.y < 1.0 ) float maxOverdrawDistance = OVERDRAW_MAX_DISTANCE; #endif - if(length(playerPos) < clamp(far-16*4, 16, maxOverdrawDistance) || texture2D(depthtex1, gl_FragCoord.xy*texelSize).x < 1.0){ discard; return;} + if(length(playerPos) < clamp(far-16*4, 16, maxOverdrawDistance) || texelFetch2D(depthtex1, ivec2(gl_FragCoord.xy), 0).x < 1.0){ discard; return;} #endif diff --git a/shaders/dimensions/DH_translucent.fsh b/shaders/dimensions/DH_translucent.fsh index 499b3e4..bd77116 100644 --- a/shaders/dimensions/DH_translucent.fsh +++ b/shaders/dimensions/DH_translucent.fsh @@ -479,7 +479,7 @@ if (gl_FragCoord.x * texelSize.x < 1.0 && gl_FragCoord.y * texelSize.y < 1.0 ) #ifdef DH_OVERDRAW_PREVENTION float distancefade = min(max(1.0 - viewDist/clamp(far-16*4, 16, maxOverdrawDistance),0.0)*5,1.0); - if(texture2D(depthtex0, gl_FragCoord.xy*texelSize).x < 1.0 || distancefade > 0.0){ + if(texelFetch2D(depthtex0, ivec2(gl_FragCoord.xy), 0).x < 1.0 || distancefade > 0.0){ gl_FragData[0].a = 0.0; material = 0.0; } diff --git a/shaders/dimensions/all_particles.fsh b/shaders/dimensions/all_particles.fsh index 2f85de3..7baedbe 100644 --- a/shaders/dimensions/all_particles.fsh +++ b/shaders/dimensions/all_particles.fsh @@ -310,7 +310,7 @@ void main() { #ifdef POM vec3 fragpos = toScreenSpace(gl_FragCoord.xyz*vec3(texelSize/RENDER_SCALE,1.0)-vec3(0.0)); - vec3 worldpos = mat3(gbufferModelViewInverse) * fragpos + gbufferModelViewInverse[3].xyz + cameraPosition; + // vec3 worldpos = mat3(gbufferModelViewInverse) * fragpos + gbufferModelViewInverse[3].xyz + cameraPosition; vec3 normal = normalMat.xyz; vec3 tangent2 = normalize(cross(tangent.rgb,normal)*tangent.w); @@ -365,8 +365,9 @@ void main() { Albedo.rgb = toLinear(Albedo.rgb); - if(dot(Albedo.rgb, vec3(0.33333)) < 1.0/255.0 || Albedo.a < 0.01 ) { discard; return; } - + // if(dot(Albedo.rgb, vec3(0.33333)) < 1.0/255.0 || Albedo.a < 0.01 ) { discard; return; } + if(Albedo.a < 0.01 ) { discard; return; } + gl_FragData[0] = vec4(encodeVec2(vec2(0.5)), encodeVec2(Albedo.rg), encodeVec2(vec2(Albedo.b,0.02)), 1.0); #endif diff --git a/shaders/dimensions/all_particles.vsh b/shaders/dimensions/all_particles.vsh index 4088649..2811599 100644 --- a/shaders/dimensions/all_particles.vsh +++ b/shaders/dimensions/all_particles.vsh @@ -96,21 +96,29 @@ void main() { #endif - #ifdef WEATHER + #if defined WEATHER || defined LINES vec3 position = mat3(gl_ModelViewMatrix) * vec3(gl_Vertex) + gl_ModelViewMatrix[3].xyz; + vec3 worldpos = mat3(gbufferModelViewInverse) * position + gbufferModelViewInverse[3].xyz; - vec3 worldpos = mat3(gbufferModelViewInverse) * position + gbufferModelViewInverse[3].xyz + cameraPosition; - bool istopv = worldpos.y > cameraPosition.y + 5.0 && lmtexcoord.w > 0.99; + #ifdef WEATHER + worldpos += cameraPosition; + bool istopv = worldpos.y > cameraPosition.y + 5.0 && lmtexcoord.w > 0.99; - if(!istopv){ + if(!istopv){ worldpos.xyz -= cameraPosition - vec3(2.0,0.0,2.0) * min(max(clamp(eyeBrightnessSmooth.y/240.0,0,1)-0.95,0)/0.05,1); - }else{ + }else{ worldpos.xyz -= cameraPosition; - } + } + #endif - position = mat3(gbufferModelView) * worldpos + gbufferModelView[3].xyz; + #if defined LINES && defined PLANET_CURVATURE + float curvature = length(worldpos) / (16*8); + worldpos.y -= curvature*curvature * CURVATURE_AMOUNT; + #endif - gl_Position = toClipSpace3(position); + position = mat3(gbufferModelView) * worldpos + gbufferModelView[3].xyz; + + gl_Position = toClipSpace3(position); #else gl_Position = ftransform(); #endif diff --git a/shaders/dimensions/all_solid.vsh b/shaders/dimensions/all_solid.vsh index 438ffa9..a705dbc 100644 --- a/shaders/dimensions/all_solid.vsh +++ b/shaders/dimensions/all_solid.vsh @@ -265,7 +265,7 @@ void main() { lmtexcoord.w = 0.0; } - #if defined Puddles || ShaderSnow > 0 + #if PUDDLE_MODE > 0 || ShaderSnow > 0 if(blockID == 215) lmtexcoord.w = 0.0; #endif #endif @@ -307,7 +307,7 @@ void main() { // normal block lightsources if(mc_Entity.x >= 100 && mc_Entity.x < 300) EMISSIVE = 0.5; - if(mc_Entity.x == 266) EMISSIVE = 0.2; // sculk stuff + if(mc_Entity.x == 266 || mc_Entity.x == 497) EMISSIVE = 0.2; // sculk stuff if(mc_Entity.x == 195) EMISSIVE = 2.3; // glow lichen @@ -323,7 +323,7 @@ void main() { if(mc_Entity.x == 244) EMISSIVE = 1.5; // soul fire - #if defined Puddles || ShaderSnow > 0 + #if PUDDLE_MODE > 0 || ShaderSnow > 0 if (mc_Entity.x == 244 || mc_Entity.x == 189) lmtexcoord.w = 0.0; #endif diff --git a/shaders/dimensions/all_translucent.fsh b/shaders/dimensions/all_translucent.fsh index 936b114..5f92d1a 100644 --- a/shaders/dimensions/all_translucent.fsh +++ b/shaders/dimensions/all_translucent.fsh @@ -624,15 +624,17 @@ if (gl_FragCoord.x * texelSize.x < 1.0 && gl_FragCoord.y * texelSize.y < 1.0 ) waterPos.xyz = getParallaxDisplacement(waterPos, playerPos); + vec3 bump = getWaveNormal(waterPos, playerPos); + #ifdef RIPPLE_WATER if(viewDist < 35 && rainStrength > 0.0 && biome_precipitation == 1 && abs(worldSpaceNormal.z) < 0.95 && abs(worldSpaceNormal.x) < 0.95) { float effectStrength = smoothstep(0.85, 1.0, lightmap.y); rippleBump = ripples(worldPos.xz); - waterPos.xyz += RIPPLE_STRENGTH * rippleBump * rainStrength * effectStrength * smoothstep(35.0, 10.0, viewDist); + bump += 0.6 * RIPPLE_STRENGTH * rippleBump * rainStrength * effectStrength * smoothstep(35.0, 10.0, viewDist); } #endif - vec3 bump = normalize(getWaveNormal(waterPos, playerPos)); + bump = normalize(bump); float bumpmult = WATER_WAVE_STRENGTH; bump = bump * vec3(bumpmult, bumpmult, bumpmult) + vec3(0.0f, 0.0f, 1.0f - bumpmult); @@ -882,6 +884,7 @@ if (gl_FragCoord.x * texelSize.x < 1.0 && gl_FragCoord.y * texelSize.y < 1.0 ) #ifdef LIGHTNING vec3 lightColor = vec3(1.0); + gl_FragData[0].a = max(gl_FragData[0].a, 1.0/255.0); #else vec3 lightColor = vec3(TORCH_R,TORCH_G,TORCH_B); #endif @@ -972,7 +975,7 @@ if (gl_FragCoord.x * texelSize.x < 1.0 && gl_FragCoord.y * texelSize.y < 1.0 ) float maxOverdrawDistance = OVERDRAW_MAX_DISTANCE; #endif - bool WATER = texture2D(colortex7, gl_FragCoord.xy*texelSize).a > 0.0 && length(feetPlayerPos) > clamp(far-16.0*4.0, 16.0, maxOverdrawDistance) && texture2D(depthtex1, gl_FragCoord.xy*texelSize).x >= 1.0; + bool WATER = texture2D(colortex7, gl_FragCoord.xy*texelSize).a > 0.0 && length(feetPlayerPos) > clamp(far-16.0*4.0, 16.0, maxOverdrawDistance) && texelFetch2D(depthtex1, ivec2(gl_FragCoord.xy), 0).x >= 1.0; if(WATER && isWater) { gl_FragData[0].a = 0.0; @@ -987,7 +990,7 @@ if (gl_FragCoord.x * texelSize.x < 1.0 && gl_FragCoord.y * texelSize.y < 1.0 ) #endif #if DEBUG_VIEW == debug_NORMALS gl_FragData[0].rgb = worldSpaceNormal.xyz * 0.1; - gl_FragData[0].a = 1; + gl_FragData[0].a = 1.0; #endif #if DEBUG_VIEW == debug_INDIRECT gl_FragData[0].rgb = Indirect_lighting * 0.1; diff --git a/shaders/dimensions/composite.fsh b/shaders/dimensions/composite.fsh index 88e1beb..beb5086 100644 --- a/shaders/dimensions/composite.fsh +++ b/shaders/dimensions/composite.fsh @@ -261,7 +261,7 @@ float convertHandDepth_2(in float depth, bool hand) { vec2 SSAO( vec3 viewPos, vec3 normal, vec3 flatnormal, bool hand, float noise ){ - int samples = 4; + int samples = 7; float occlusion = 0.0; float sss = 0.0; @@ -272,8 +272,6 @@ vec2 SSAO( float distanceScale = hand ? 30.0 : mix(40.0, 10.0, pow(clamp(1.0 - linearViewDistance/50.0,0.0,1.0),2.0)); float depthCancelation = (linearViewDistance*linearViewDistance) / distanceScale ; - if (linearViewDistance < 15.0 || hand) samples = 7; - // distanceScale *= 10; vec2 screenEdges = 2.0/vec2(viewWidth, viewHeight); @@ -377,9 +375,11 @@ void main() { // bool blocklights = abs(dataUnpacked1.w-0.8) <0.01; float z = texelFetch2D(depthtex1,ivec2(gl_FragCoord.xy),0).x; + float z0 = texelFetch2D(depthtex0,ivec2(gl_FragCoord.xy),0).x; #ifdef DISTANT_HORIZONS float DH_depth1 = texelFetch2D(dhDepthTex1,ivec2(gl_FragCoord.xy),0).x; + float DH_depth0 = texelFetch2D(dhDepthTex,ivec2(gl_FragCoord.xy),0).x; float swappedDepth = z >= 1.0 ? DH_depth1 : z; #else float DH_depth1 = 1.0; @@ -390,6 +390,7 @@ void main() { vec3 playerPos = mat3(gbufferModelViewInverse) * viewPos; float depth = z; + float depth0 = z0; #ifdef DISTANT_HORIZONS float _near = near; @@ -402,16 +403,29 @@ void main() { depth = linearizeDepthFast(depth, _near, _far); depth = depth / dhFarPlane; + + _near = near; + _far = far*4.0; + + if (depth0 >= 1.0) { + depth0 = DH_depth1; + _near = dhNearPlane; + _far = dhFarPlane; + } + + depth0 = linearizeDepthFast(depth0, _near, _far); + depth0 = depth0 / dhFarPlane; #endif - if(depth < 1.0) - gl_FragData[2] = vec4(vec3(0.0), depth * depth * 65000.0); + if(depth < 1.0 || depth0 < 1.0) + gl_FragData[2] = vec4(vec2(0.0), depth0 * depth0 * 65000.0, depth * depth * 65000.0); else - gl_FragData[2] = vec4(vec3(0.0), 65000.0); + gl_FragData[2] = vec4(vec2(0.0), 65000.0, 65000.0); + + vec3 FlatNormals = normalize(texture2D(colortex15,texcoord).rgb * 2.0 - 1.0); #if defined DENOISE_SSS_AND_SSAO && indirect_effect == 1 - vec3 FlatNormals = normalize(texture2D(colortex15,texcoord).rgb * 2.0 - 1.0); if(z >= 1.0) FlatNormals = normal; diff --git a/shaders/dimensions/composite1.fsh b/shaders/dimensions/composite1.fsh index ed10ba3..e0c24c2 100644 --- a/shaders/dimensions/composite1.fsh +++ b/shaders/dimensions/composite1.fsh @@ -45,11 +45,11 @@ uniform float rainStrength; uniform sampler2D snowTexA; uniform sampler2D snowTexN; #endif - #if ShaderSnow > 0 || defined Puddles + #if ShaderSnow > 0 || PUDDLE_MODE > 0 uniform sampler2D snowTexR; #endif - #if defined RIPPLE_PUDDLES && defined Puddles + #if defined RIPPLE_PUDDLES && PUDDLE_MODE > 0 #include "/lib/ripples.glsl" uniform int biome_precipitation; @@ -225,6 +225,7 @@ float convertHandDepth_2(in float depth, bool hand) { #endif uniform vec3 relativeEyePosition; +#define MAIN_SHADOW_PASS #define FULLRESDEPTH #include "/lib/specular.glsl" @@ -500,13 +501,19 @@ vec2 SSRT_Shadows(vec3 viewPos, bool depthCheck, vec3 lightDir, float noise, boo return vec2(shadows, SSS / samples ); } -float SSRT_FlashLight_Shadows(vec3 viewPos, bool depthCheck, vec3 lightDir, float noise){ +#if defined FLASHLIGHT_SHADOWS && defined FLASHLIGHT +float SSRT_FlashLight_Shadows(vec3 viewPos, bool depthCheck, vec3 lightDir, float noise, vec3 normals, bool hand){ + if(hand) return 1.0; - float steps = 16.0; - float Shadow = 1.0; + vec3 WlightDir = normalize((gbufferModelViewInverse*vec4(lightDir, 1.0)).xyz); + + float NdotL = dot(normals, WlightDir); + NdotL = smoothstep(0.0, 0.2, abs(NdotL)); + + float shadows = 1.0; + float samples = 16.0; float SSS = 0.0; - // isSSS = true; float _near = near; float _far = far*4.0; @@ -514,44 +521,43 @@ float SSRT_FlashLight_Shadows(vec3 viewPos, bool depthCheck, vec3 lightDir, floa _near = dhNearPlane; _far = dhFarPlane; } - - vec3 clipPosition = toClipSpace3_DH(viewPos, depthCheck); + vec3 position = toClipSpace3_DH(viewPos, depthCheck) ; + //prevents the ray from going behind the camera - float rayLength = ((viewPos.z + lightDir.z * _far*sqrt(3.)) > -_near) ? - (-_near -viewPos.z) / lightDir.z : _far*sqrt(3.); + float rayLength = ((viewPos.z + lightDir.z * _far * sqrt(3.)) > -_near) ? (-_near - viewPos.z) / lightDir.z : _far * sqrt(3.); - vec3 direction = toClipSpace3_DH(viewPos + lightDir*rayLength, depthCheck) - clipPosition; //convert to clip space + vec3 direction = toClipSpace3_DH(viewPos + lightDir*rayLength, depthCheck) - position; + direction.xyz = direction.xyz / max(max(abs(direction.x)/0.0005, abs(direction.y)/0.0005),400.0); //fixed step size + direction *= 6.0; - direction.xyz = direction.xyz / max(abs(direction.x)/0.0005, abs(direction.y)/0.0005); //fixed step size - - float Stepmult = 6.0; - - vec3 rayDir = direction * Stepmult * vec3(RENDER_SCALE,1.0); - vec3 screenPos = clipPosition * vec3(RENDER_SCALE,1.0) + rayDir*noise; + position.xy *= RENDER_SCALE; + direction.xy *= RENDER_SCALE; + + vec3 newPos = position + direction*noise; + // literally shadow bias to fight shadow acne due to precision problems when comparing sampled depth and marched position + //newPos += direction*0.3; - for (int i = 0; i < int(steps); i++) { + for (int i = 0; i < int(16); i++) { - float samplePos = texture2D(depthtex2, screenPos.xy).x; + float samplePos = texelFetch2D(depthtex2, ivec2(newPos.xy/texelSize).xy,0).x; #ifdef DISTANT_HORIZONS - if(depthCheck) samplePos = texture2D(dhDepthTex1, screenPos.xy).x; + if(depthCheck) samplePos = texelFetch2D(dhDepthTex1, ivec2(newPos.xy/texelSize),0).x; #endif - if(samplePos < screenPos.z){// && (samplePos <= max(minZ,maxZ) && samplePos >= min(minZ,maxZ))){ - // vec2 linearZ = vec2(swapperlinZ(screenPos.z, _near, _far), swapperlinZ(samplePos, _near, _far)); - // float calcthreshold = abs(linearZ.x - linearZ.y) / linearZ.x; - - // if (calcthreshold < 0.035) - Shadow = 0.0; + if(samplePos < newPos.z && samplePos > 0.0){// && (samplePos <= max(minZ,maxZ) && samplePos >= min(minZ,maxZ))){ + shadows = 0.0; + break; } - screenPos += rayDir; + newPos += direction; } - return Shadow; + return clamp(shadows*NdotL, 1.0-FLASHLIGHT_SHADOWS_STRENGTH, 1.0); } +#endif void Emission( inout vec3 Lighting, @@ -587,7 +593,7 @@ void doEdgeAwareBlur( for(int i = 0; i < 4; i++) { #ifdef DISTANT_HORIZONS - float offsetDepth = sqrt(texelFetch2D(depth, UV + OFFSET[i] + UV_NOISE,0).a/65000.0); + float offsetDepth = sqrt(texelFetch2D(depth, UV + OFFSET[i] + UV_NOISE,0).z/65000.0); #else float offsetDepth = ld(convertHandDepth_2(texelFetch2D(depth, UV + OFFSET[i] + UV_NOISE, 0).r,hand)); #endif @@ -636,7 +642,7 @@ vec4 BilateralUpscale_VLFOG(sampler2D tex, sampler2D depth, float referenceDepth ivec2( 0, 0) ); - for(int i = 0; i < 4; i++) { + for(int i = 0; i < 5; i++) { #ifdef DISTANT_HORIZONS float offsetDepth = sqrt(texelFetch2D(depth, UV_DEPTH + (OFFSET[i] + UV_NOISE) * SCALE,0).a/65000.0); #else @@ -775,15 +781,22 @@ uniform float wetness; void applyPuddles( in vec3 worldPos, in vec3 flatNormals, in vec2 lightmap, in bool isWater, in int isEyeInWater, inout vec3 albedo, inout vec3 normals, inout float roughness, inout float f0 ){ + /* PUDDLE_MODE + 0 = OFF, NO WETNESS + 1 = puddles + full wetness + 2 = only puddles + 3 = only full wetness + */ + float effectStrength = smoothstep(0.85, 1.0, lightmap.y); //float effectStrength = smoothstep(0.85, 1.0, max(lightmap.y-step(1.0,lightmap.x), 0.0)); vec2 snowCoords = worldPos.xz*0.1; - #if ShaderSnow > 0 || defined Puddles + #if ShaderSnow > 0 || PUDDLE_MODE > 0 float snowR = texture2D(snowTexR, snowCoords).g; #endif - #ifdef Puddles + #if PUDDLE_MODE > 0 if (wetnessAmount > 0.01) { float halfWet = min(wetnessAmount,1.0); float fullWet = clamp(wetnessAmount - 2.0,0.0,1.0); @@ -794,11 +807,23 @@ uniform float wetness; UV = mix(UV, worldPos.zy*vec2(2.0, 0.5)+driprate, abs(flatNormals.x)); float noise = texture2D(noisetex, UV * 0.02).b; - - float puddles = max(halfWet - noise,0.0); - puddles = clamp(halfWet - exp(-25.0 * puddles*puddles*puddles*puddles*puddles*Puddle_Size),0.0,1.0); - float wetnessStages = mix(puddles, 1.0, fullWet) * effectStrength; + #if PUDDLE_MODE == 1 + float puddles = max(halfWet - noise,0.0); + puddles = clamp(halfWet - exp(-25.0 * puddles*puddles*puddles*puddles*puddles*Puddle_Size),0.0,1.0); + puddles = mix(puddles, 1.0, fullWet); + #endif + + #if PUDDLE_MODE == 2 + float puddles = max(halfWet - noise,0.0); + puddles = clamp(halfWet - exp(-25.0 * puddles*puddles*puddles*puddles*puddles*Puddle_Size),0.0,1.0); + #endif + + #if PUDDLE_MODE == 3 + float puddles = fullWet; + #endif + + float wetnessStages = puddles * effectStrength; if(isWater) wetnessStages = 0.0; #ifdef RIPPLE_PUDDLES @@ -881,9 +906,9 @@ void main() { bool isDHrange = z >= 1.0; #ifdef DISTANT_HORIZONS - float DH_mixedLinearZ = sqrt(texture2D(colortex12,texcoord).a/65000.0); - float DH_depth0 = texture2D(dhDepthTex,texcoord).x; - float DH_depth1 = texture2D(dhDepthTex1,texcoord).x; + float DH_mixedLinearZ = sqrt(texelFetch2D(colortex12,ivec2(gl_FragCoord.xy), 0).z/65000.0); + float DH_depth0 = texelFetch2D(dhDepthTex,ivec2(gl_FragCoord.xy), 0).x; + float DH_depth1 = texelFetch2D(dhDepthTex1,ivec2(gl_FragCoord.xy), 0).x; float depthOpaque = z; float depthOpaqueL = linearizeDepthFast(depthOpaque, near, farPlane); @@ -1349,18 +1374,20 @@ void main() { #else const vec3 lpvPos = vec3(0.0); #endif - vec3 blockLightColor = doBlockLightLighting( vec3(TORCH_R,TORCH_G,TORCH_B), lightmap.x, feetPlayerPos, lpvPos); + + vec3 blockLightColor = doBlockLightLighting(vec3(TORCH_R,TORCH_G,TORCH_B), lightmap.x, feetPlayerPos, lpvPos, viewPos, isDHrange, blueNoise(), FlatNormals, hand); Indirect_lighting += blockLightColor; vec4 flashLightSpecularData = vec4(0.0); #ifdef FLASHLIGHT - vec3 newViewPos = viewPos; - - - float flashlightshadows = SSRT_FlashLight_Shadows(toScreenSpace_DH(texcoord/RENDER_SCALE, z, DH_depth1), isDHrange, newViewPos, interleaved_gradientNoise_temporal()); + #ifdef FLASHLIGHT_SHADOWS + vec3 newViewPos = viewPos + vec3(-0.25, 0.2, 0.0); + float flashlightshadows = SSRT_FlashLight_Shadows(toScreenSpace_DH(texcoord/RENDER_SCALE, z, DH_depth1), isDHrange, -newViewPos, blueNoise(), FlatNormals, hand); + #else + float flashlightshadows = 1.0; + #endif - - Indirect_lighting += calculateFlashlight(texcoord, viewPos, albedoSmooth, slopednormal, flashLightSpecularData, hand); + Indirect_lighting += flashlightshadows*calculateFlashlight(texcoord, viewPos, albedoSmooth, slopednormal, flashLightSpecularData, hand); #endif ///////////////////////////////////////////////////////////////////////////////////// @@ -1458,7 +1485,7 @@ void main() { #endif #endif - #if defined OVERWORLD_SHADER && defined DEFERRED_SPECULAR && (defined Puddles || ShaderSnow > 0) + #if defined OVERWORLD_SHADER && defined DEFERRED_SPECULAR && (PUDDLE_MODE > 0 || ShaderSnow > 0) if(!hand && !entities && (wetnessAmount > 0.01 || snowAmount > 0.01)) applyPuddles(feetPlayerPos + cameraPosition, FlatNormals, lightmap, isWater, isEyeInWater, albedo, normal, SpecularTex.r, SpecularTex.g); #endif diff --git a/shaders/dimensions/composite2.fsh b/shaders/dimensions/composite2.fsh index 676d364..5f257a8 100644 --- a/shaders/dimensions/composite2.fsh +++ b/shaders/dimensions/composite2.fsh @@ -155,6 +155,7 @@ float invLinZ (float lindepth){ uniform float nightVision; #ifdef OVERWORLD_SHADER + uniform float auroraAmount; const bool shadowHardwareFiltering = true; uniform sampler2DShadow shadow; @@ -555,7 +556,7 @@ void main() { #ifdef CAVE_FOG #if (CAVE_DETECTION == 0.0) || (CAVE_DETECTION == 1.0) #if (CAVE_DETECTION == 1.0) - float caveFactor = 1-smoothstep(60.0, 63.0, cameraPosition.y); + float caveFactor = 1.0-smoothstep(60.0, 63.0, cameraPosition.y); #else float caveFactor = 1.0; #endif @@ -570,7 +571,7 @@ void main() { float atmosphereAlpha = 1.0; - vec3 sceneColor = texelFetch2D(colortex3,ivec2(tc/texelSize),0).rgb * VolumetricClouds.a + VolumetricClouds.rgb; + vec3 sceneColor = texelFetch2D(colortex3,texcoord,0).rgb * VolumetricClouds.a + VolumetricClouds.rgb; vec4 VolumetricFog = GetVolumetricFog(viewPos0, WsunVec, BN, directLightColor, indirectLightColor, indirectLightColor_dynamic, atmosphereAlpha, VolumetricClouds.rgb, cloudPlaneDistance); VolumetricFog = vec4(VolumetricClouds.rgb * VolumetricFog.a + VolumetricFog.rgb, VolumetricFog.a*VolumetricClouds.a); diff --git a/shaders/dimensions/composite3.fsh b/shaders/dimensions/composite3.fsh index 49e47d5..a1e63c4 100644 --- a/shaders/dimensions/composite3.fsh +++ b/shaders/dimensions/composite3.fsh @@ -4,6 +4,7 @@ flat varying vec3 zMults; flat varying vec2 TAA_Offset; flat varying vec3 WsunVec; +flat varying vec3 WmoonVec; #ifdef OVERWORLD_SHADER flat varying vec3 skyGroundColor; @@ -344,7 +345,7 @@ vec4 bilateralUpsample(out float outerEdgeResults, float referenceDepth, sampler for(int i = 0; i < 5; i++) { #ifdef DISTANT_HORIZONS - float offsetDepth = sqrt(texelFetch2D(depth, UV_DEPTH + (OFFSET[i] + UV_NOISE) * SCALE,0).a/65000.0); + float offsetDepth = sqrt(texelFetch2D(depth, UV_DEPTH + (OFFSET[i] + UV_NOISE) * SCALE,0).z/65000.0); #else float offsetDepth = linearize(texelFetch2D(depth, UV_DEPTH + (OFFSET[i] + UV_NOISE) * SCALE, 0).r); #endif @@ -506,6 +507,11 @@ float getBorderFogDensity(float linearDistance, vec3 playerPos, bool sky){ return borderFogDensity; } +#if AURORA_LOCATION > 0 + uniform float auroraAmount; + #include "/lib/aurora.glsl" +#endif + void main() { /* RENDERTARGETS:7,3,10 */ @@ -520,7 +526,7 @@ void main() { float swappedDepth = z; #ifdef DISTANT_HORIZONS - float DH_depth0 = texture2D(dhDepthTex,texcoord).x; + float DH_depth0 = texelFetch2D(dhDepthTex, ivec2(gl_FragCoord.xy),0).x; float depthOpaque = z; float depthOpaqueL = linearizeDepthFast(depthOpaque, near, farPlane); @@ -547,7 +553,7 @@ void main() { vec3 playerPos_normalized = normalize(playerPos); #ifndef DISTANT_HORIZONS - float z2 = texture2D(depthtex1, texcoord).x; + float z2 = texelFetch2D(depthtex1, ivec2(gl_FragCoord.xy),0).x; vec3 viewPos_alt = toScreenSpace(vec3(texcoord/RENDER_SCALE, z2)); vec3 playerPos_alt = mat3(gbufferModelViewInverse) * viewPos_alt + gbufferModelViewInverse[3].xyz; float linearDistance_cylinder_alt = length(playerPos_alt.xz); @@ -587,8 +593,8 @@ void main() { ////// --------------- get volumetrics #ifdef DISTANT_HORIZONS - float DH_mixedLinearZ = sqrt(texelFetch2D(colortex12,ivec2(gl_FragCoord.xy),0).a/65000.0); - vec4 temporallyFilteredVL = VLTemporalFiltering(viewPos, DH_mixedLinearZ, colortex12,hand); + float DH_mixedLinearZ = sqrt(texelFetch2D(colortex12,ivec2(gl_FragCoord.xy),0).z/65000.0); + vec4 temporallyFilteredVL = VLTemporalFiltering(viewPos, DH_mixedLinearZ, colortex12, hand); #else vec4 temporallyFilteredVL = VLTemporalFiltering(viewPos, frDepth, depthtex0, hand); #endif @@ -794,7 +800,7 @@ void main() { // blend all fog types. volumetric fog, volumetric clouds, distance based fogs for lava, powdered snow, blindness, and darkness. blendAllFogTypes(color, bloomyFogMult, temporallyFilteredVL, linearDistance, playerPos_normalized, cameraPosition, isSky, isLightning); - ////// --------------- RAINBOWS + ////// --------------- RAINBOW #if RAINBOW > 0 && defined OVERWORLD_SHADER #if RAINBOW > 1 @@ -832,6 +838,27 @@ void main() { } #endif + ////// --------------- AURORA + + #if AURORA_LOCATION > 0 && defined OVERWORLD_SHADER + if (WsunVec.y < 0.0 && temporallyFilteredVL.a > 0.001 && isSky + #if AURORA_LOCATION < 2 + && auroraAmount > 0.001 + #endif + #ifdef AURORA_MOON + && WmoonVec.y < 0.1 + #endif + #if AURORA_CHANCE < 100 + && hash_aurora(float(worldDay)) <= 0.01 * float(AURORA_CHANCE) + #endif + ) + { + vec3 aurora = 0.0875*aurora(playerPos_normalized, 21, blueNoise(), WmoonVec.y, WsunVec.y); + + color += aurora * temporallyFilteredVL.a; + } + #endif + ////// --------------- FINALIZE #ifdef display_LUT float zoomLevel = 1.0; diff --git a/shaders/dimensions/composite3.vsh b/shaders/dimensions/composite3.vsh index 0d50ed2..2e671d0 100644 --- a/shaders/dimensions/composite3.vsh +++ b/shaders/dimensions/composite3.vsh @@ -1,5 +1,9 @@ #include "/lib/settings.glsl" +#ifdef CUSTOM_MOON_ROTATION + #include "/lib/SSBOs.glsl" +#endif + varying vec2 texcoord; flat varying vec3 zMults; @@ -13,6 +17,7 @@ flat varying vec3 zMults; #endif flat varying vec3 WsunVec; +flat varying vec3 WmoonVec; uniform float far; uniform float near; @@ -21,6 +26,7 @@ uniform float dhNearPlane; uniform mat4 gbufferModelViewInverse; uniform vec3 sunPosition; +uniform vec3 moonPosition; uniform float sunElevation; flat varying vec2 TAA_Offset; uniform int framemod8; @@ -47,6 +53,19 @@ void main() { WsunVec = normalize(mat3(gbufferModelViewInverse) * sunPosition); #endif + #if AURORA_LOCATION > 0 + #ifdef CUSTOM_MOON_ROTATION + WmoonVec = customMoonVecSSBO; + #else + #ifdef SMOOTH_MOON_ROTATION + WmoonVec = WmoonVecSmooth; + #else + WmoonVec = normalize(mat3(gbufferModelViewInverse) * moonPosition); + #endif + if(dot(-WmoonVec, WsunVec) < 0.9999) WmoonVec = -WmoonVec; + #endif + #endif + #if defined CUMULONIMBUS_LIGHTNING && CUMULONIMBUS > 0 readSceneControllerParameters(colortex4, parameters.smallCumulus, parameters.largeCumulus, parameters.altostratus, parameters.cirrus, parameters.fog); #endif diff --git a/shaders/dimensions/deferred.fsh b/shaders/dimensions/deferred.fsh index c0b83f5..932782e 100644 --- a/shaders/dimensions/deferred.fsh +++ b/shaders/dimensions/deferred.fsh @@ -63,6 +63,9 @@ uniform ivec2 eyeBrightnessSmooth; // uniform ivec2 eyeBrightness; uniform float caveDetection; uniform int isEyeInWater; +uniform float auroraAmount; + +#define LUT // vec4 lightCol = vec4(lightSourceColor, float(sunElevation > 1e-5)*2-1.); @@ -216,6 +219,9 @@ uniform bool worldTimeChangeCheck; uniform int hideGUI; +#if AURORA_LOCATION > 0 + #include "/lib/aurora.glsl" +#endif void main() { /* DRAWBUFFERS:4 */ @@ -381,7 +387,6 @@ if (gl_FragCoord.x > 18.+257. && gl_FragCoord.y > 1. && gl_FragCoord.x < 18+257+ vec3 sky = texelFetch2D(colortex4,ivec2(gl_FragCoord.xy)-ivec2(257,0),0).rgb/150.0; sky = mix(averageSkyCol_Clouds * AmbientLightTint * 0.25, sky, pow(clamp(viewVector.y+1.0,0.0,1.0),5.0)); - vec3 suncol = lightSourceColor; #ifdef ambientLight_only @@ -401,7 +406,26 @@ if (gl_FragCoord.x > 18.+257. && gl_FragCoord.y > 1. && gl_FragCoord.x < 18+257+ float atmosphereAlpha = 1.0; WsunVec = mix(WmoonVec, WsunVec, clamp(float(sunElevation > 1e-5)*2.0-1.0 ,0,1)); - vec4 volumetricFog = GetVolumetricFog(viewPos, WsunVec, vec2(noise, 1.0-noise), suncol*2.5, skyGroundCol/30.0, averageSkyCol_Clouds*5.0, atmosphereAlpha, volumetricClouds.rgb, cloudPlaneDistance); + vec4 volumetricFog = GetVolumetricFog(viewPos, WsunVec, vec2(noise, 1.0-noise), suncol*2.5, skyGroundCol/30.0, averageSkyCol_Clouds*5.0, atmosphereAlpha, volumetricClouds.rgb, cloudPlaneDistance); + + #if AURORA_LOCATION > 0 + if (WsunVec.y < 0.0 && volumetricClouds.a > 0.01 + #if AURORA_LOCATION < 2 + && auroraAmount > 0.001 + #endif + #ifdef AURORA_MOON + && WmoonVec.y < 0.1 + #endif + #if AURORA_CHANCE < 100 + && hash_aurora(float(worldDay)) <= 0.01 * float(AURORA_CHANCE) + #endif + ) + { + vec3 aurora = aurora(viewVector, 10, noise, WmoonVec.y, WsunVec.y); + + sky += 2.4 * aurora; + } + #endif sky = sky * volumetricClouds.a + volumetricClouds.rgb / 5.0; sky = sky * volumetricFog.a + volumetricFog.rgb / 5.0; diff --git a/shaders/dimensions/fogBehindTranslucent_pass.fsh b/shaders/dimensions/fogBehindTranslucent_pass.fsh index 76bdacb..5bb00f8 100644 --- a/shaders/dimensions/fogBehindTranslucent_pass.fsh +++ b/shaders/dimensions/fogBehindTranslucent_pass.fsh @@ -87,6 +87,7 @@ float linearizeDepthFast(const in float depth, const in float near, const in flo #ifdef OVERWORLD_SHADER + uniform float auroraAmount; const bool shadowHardwareFiltering = true; uniform sampler2DShadow shadow; @@ -259,6 +260,11 @@ vec2 decodeVec2(float a){ return fract( a * constant1 ) * constant2 ; } +#if AURORA_LOCATION > 0 + #define LUT + #include "/lib/aurora.glsl" +#endif + //////////////////////////////VOID MAIN////////////////////////////// //////////////////////////////VOID MAIN////////////////////////////// //////////////////////////////VOID MAIN////////////////////////////// @@ -278,12 +284,11 @@ void main() { bool iswater = alpha > 0.99; - bool isLightning = alpha < 0.51 && alpha > 0.49; ////////////////////////////////////////////////////////// ///////////////// BEHIND OF TRANSLUCENTS ///////////////// ////////////////////////////////////////////////////////// - if(blendedAlpha > 0.0 || iswater || isLightning){ + if(blendedAlpha > 0.0 || iswater){ float noise_1 = R2_dither(); float noise_2 = blueNoise(); @@ -328,9 +333,11 @@ void main() { vec3 directLightColor = lightCol.rgb / 2400.0; vec3 directSunlightColor = sunlightCol / 2400.0; vec3 directMoonlightColor = moonlightCol / 2400.0; + #ifdef CUSTOM_MOON_ROTATION directMoonlightColor *= mix(0.0, 1.0, clamp(WmoonVec.y + 0.05, 0.0, 0.1)/0.1); #endif + vec3 indirectLightColor = averageSkyCol / 1200.0; vec3 indirectLightColor_dynamic = averageSkyCol_Clouds / 1200.0; @@ -360,7 +367,7 @@ void main() { indirectLightColor_dynamic += mix(MIN_LIGHT_AMOUNT * 0.004 + nightVision*0.02, MIN_LIGHT_AMOUNT_INSIDE * 0.004 + nightVision*0.02, 1.0 - lightmap.y); - indirectLightColor_dynamic += vec3(TORCH_R,TORCH_G,TORCH_B) * pow(1.0-sqrt(1.0-clamp(lightmap.x,0.0,1.0)),2.0) * TORCH_AMOUNT; + indirectLightColor_dynamic += vec3(TORCH_R,TORCH_G,TORCH_B) * pow(1.0-sqrt(1.0-clamp(lightmap.x,0.0,1.0)),2.0) * TORCH_AMOUNT * blendedAlpha; vec4 finalVolumetrics = vec4(0.0,0.0,0.0,1.0); float cloudPlaneDistance = 0.0; @@ -371,7 +378,26 @@ void main() { float atmosphereAlpha = 1.0; vec4 VolumetricFog = GetVolumetricFog(viewPos1, WsunVec, vec2(noise_1, noise_2), directLightColor, indirectLightColor, indirectLightColor_dynamic, atmosphereAlpha, VolumetricClouds.rgb,cloudPlaneDistance); - + + #if AURORA_LOCATION > 0 + if (WrealSunVec.y < 0.0 && VolumetricClouds.a > 0.01 + #if AURORA_LOCATION < 2 + && auroraAmount > 0.001 + #endif + #ifdef AURORA_MOON + && WmoonVec.y < 0.1 + #endif + #if AURORA_CHANCE < 100 + && hash_aurora(float(worldDay)) <= 0.01 * float(AURORA_CHANCE) + #endif + ) + { + vec3 aurora = aurora(normalize(playerPos), 10, noise_2, WmoonVec.y, WrealSunVec.y); + + finalVolumetrics.rgb += 0.7 * aurora * VolumetricClouds.a; + } + #endif + finalVolumetrics.rgb += VolumetricClouds.rgb; finalVolumetrics.a *= VolumetricClouds.a; #endif diff --git a/shaders/dimensions/setup.csh b/shaders/dimensions/setup.csh index c4afb71..aff96ec 100644 --- a/shaders/dimensions/setup.csh +++ b/shaders/dimensions/setup.csh @@ -961,6 +961,19 @@ void main() { mixMask = BuildLpvMask(1u, 1u, 1u, 1u, 1u, 0u); mixWeight = 0.9; break; + case BLOCK_SCULK_VEIN: + mixMask = BuildLpvMask(1u, 1u, 1u, 1u, 1u, 0u); + mixWeight = 0.9; + break; + case BLOCK_GLOW_LICHEN: + mixWeight = 1.00; + break; + case BLOCK_VINE: + mixWeight = 1.00; + break; + case BLOCK_VINE_OTHER: + mixWeight = 0.5; + break; case BLOCK_DOOR_N: mixMask = BuildLpvMask(0u, 1u, 1u, 1u, 1u, 1u); diff --git a/shaders/lang/en_us.lang b/shaders/lang/en_us.lang index 8eb193c..7913aca 100644 --- a/shaders/lang/en_us.lang +++ b/shaders/lang/en_us.lang @@ -1,6 +1,6 @@ option.SHADER_VERSION_LABEL = §dECLIPSE§r - A Bliss Edit prefix.SHADER_VERSION_LABEL = V - value.SHADER_VERSION_LABEL.482 = 2.1.4 + value.SHADER_VERSION_LABEL.482 = 3.0.0 # if you're here to translate, this is not a joke, these do what they say profile.POTATO=§4Potato @@ -203,7 +203,9 @@ screen.Direct_Light = Direct Light value.LPV_VL_FOG_ILLUMINATION.2 = On option.LPV_VL_FOG_ILLUMINATION_BRIGHTNESS = Fog Light Propagation Brightness suffix.LPV_VL_FOG_ILLUMINATION_BRIGHTNESS=% - option.VANILLA_LIGHTMAP_MASK = Vanilla Lightmap Mask + option.VANILLA_LIGHTMAP_MASK = Vanilla Lightmap Mask + option.LPV_HANDHELD_SHADOWS = Handheld Shadows + option.LPV_HANDHELD_SHADOWS_STRENGTH = Handheld Shadows Strength screen.Ambient_light = Ambient Light @@ -767,6 +769,19 @@ screen.Rainbow_Settings = Rainbow Settings option.RAINBOW_TIME = Rainbow Fade Time (seconds) option.RAINBOW_ONLY_BELOW_CLOUDS = Rainbow above Clouds +screen.AURORA_SETTINGS = Aurora Settings + option.AURORA_LOCATION = Aurora + value.AURORA_LOCATION.0 = Off + value.AURORA_LOCATION.1 = Only in snowy biome + value.AURORA_LOCATION.2 = Always on + option.AURORA_MOON = Aurora only when moon is below horizon + option.AURORA_CHANCE = Aurora Chance + suffix.AURORA_CHANCE = % + option.AURORA_BRIGHTNESS = Aurora Brightness + option.AURORA_R = Aurora Red + option.AURORA_G = Aurora Green + option.AURORA_B = Aurora Blue + option.MATERIAL_AO = Material Ambient Occlusion option.NORMAL_MAP_MULT = Normal map multiplier value.NORMAL_MAP_MULT.1.0 = Default 1.0 §aresourcepacks expect this value @@ -922,7 +937,7 @@ screen.POM.comment = Configure settings related to parallax occlusion mapping th screen.Porosity.comment = Configure settings related to wetness and puddles option.Porosity.comment = §bWhat is this?§r Porosity is a description of how porous some material is, or essentially how much water can be held inside it. for examle, sponges are very porous; water is contained within and darkens it as a results. §aPERFORMANCE COST:§r low - option.Puddles.comment = Toggle puddles for when it rains. §aPERFORMANCE COST:§r low + option.PUDDLE_MODE.comment = Toggle puddles for when it rains. §aPERFORMANCE COST:§r low option.Puddle_Size.comment = Configure the size of the puddles. option.FAKE_REFRACTION_AMOUNT.comment = Configure the amount of distortion refraction will do. §bWhat is this?§r you could think of refraction as light bending when going through water or glass, making the things viewed through them look stretched, squished, distorted. §aPERFORMANCE COST:§r very low @@ -963,7 +978,11 @@ screen.World.comment = Configure settings for various things that happen in the screen.Water_fog_color.comment = Configure colors of the water fog. screen.World_Effects = World Weather Effects - option.Puddles = Puddles + option.PUDDLE_MODE = Puddles + value.PUDDLE_MODE.0 = No Wetness + value.PUDDLE_MODE.1 = Puddles + Completely Wet + value.PUDDLE_MODE.2 = Only Puddles + value.PUDDLE_MODE.3 = Only Complete Wetness option.Puddle_Size = Puddle Size Multiplier option.Puddle_Reflection_Sharpness = Puddle Reflection Sharpness option.Puddle_Reflection_Sharpness.comment = Controls the blurriness of puddles. 1.0 means mirror like diff --git a/shaders/lib/aurora.glsl b/shaders/lib/aurora.glsl new file mode 100644 index 0000000..faeb980 --- /dev/null +++ b/shaders/lib/aurora.glsl @@ -0,0 +1,112 @@ +// from https://www.shadertoy.com/view/XtGGRt, edited + +// Auroras by nimitz 2017 (twitter: @stormoid) +// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License +// Contact the author for other licensing options + +/* + + There are two main hurdles I encountered rendering this effect. + First, the nature of the texture that needs to be generated to get a believable effect + needs to be very specific, with large scale band-like structures, small scale non-smooth variations + to create the trail-like effect, a method for animating said texture smoothly and finally doing all + of this cheaply enough to be able to evaluate it several times per fragment/pixel. + + The second obstacle is the need to render a large volume while keeping the computational cost low. + Since the effect requires the trails to extend way up in the atmosphere to look good, this means + that the evaluated volume cannot be as constrained as with cloud effects. My solution was to make + the sample stride increase polynomially, which works very well as long as the trails are lower opcaity than + the rest of the effect. Which is always the case for auroras. + + After that, there were some issues with getting the correct emission curves and removing banding at lowered + sample densities, this was fixed by a combination of sample number influenced dithering and slight sample blending. + + N.B. the base setup is from an old shader and ideally the effect would take an arbitrary ray origin and + direction. But this was not required for this demo and would be trivial to fix. +*/ + +float hash_aurora(float p) +{ + p = fract(p * .1031); + p *= p + 33.33; + p *= p + p; + return fract(p); +} + +mat2 mm2(in float a) { + float c = cos(a), s = sin(a); + return mat2(c, s, -s, c); +} + +const mat2 m2 = mat2(0.95534, 0.29552, -0.29552, 0.95534); + +float tri(in float x) { + return clamp(abs(fract(x) - 0.5), 0.01, 0.49); +} + +vec2 tri2(in vec2 p) { + float triX = tri(p.x); + float triY = tri(p.y); + return vec2(triX + triY, tri(triX + p.y)); +} + +float triNoise2d(in vec2 p) { + float z = 1.8; + float z2 = 2.5; + float rz = 0.0; + p *= mm2(p.x * 0.06); + vec2 bp = p; + mat2 rotation = mm2(frameTimeCounter * 0.06); + + for (int i = 0; i < 3; i++) { + vec2 dg = tri2(bp * 1.75) * 0.75; + dg *= rotation; + p -= dg / z2; + + bp *= 1.3; + z2 *= 0.45; + z *= 0.42; + p *= 1.21 + (rz - 1.0) * 0.02; + + rz += tri(p.x + tri(p.y)) * z; + p *= -m2; + } + return clamp(1.0 / pow(rz * 29.0, 1.6), 0.0, 0.55); +} + +vec3 aurora(vec3 dir, int samples, float noise, float WmoonVecY, float WsunVecY) { + vec3 col = vec3(0.0); + vec3 avgCol = vec3(0.0); + float hash = 0.05 * noise; + float fade = dir.y * 2.0 + 0.4; + + float atmosphereGround = 1.0 - exp2(-50.0 * pow(clamp(dir.y+0.025,0.0,1.0),2.0)); + + #ifdef LUT + float mult = 6.0; + #else + float mult = 3.0; + #endif + + for (int i = 0; i < samples; i++) { + float mI = mult * float(i); + float of = hash * smoothstep(0.0, 12.0, mI); + float pt = (0.8 + pow(mI, 1.4) * 0.0016) / fade - of; + vec3 bpos = pt * dir; + float rzt = triNoise2d(bpos.zx); + vec3 col2 = vec3(0.0, 0.0, 0.0); + col2 = (sin(vec3(AURORA_R, AURORA_G, AURORA_B) + mI * 0.063) * 0.5 + 0.5) * rzt; + avgCol = mix(avgCol, col2, 0.1); + col += avgCol * exp2(-mI * 0.05 - 2.5); + } + + vec3 auroraCol = 14.5*pow(col, vec3(1.45)); + + #ifdef AURORA_MOON + auroraCol *= smoothstep(0.1, 0.0, WmoonVecY); + #endif + + auroraCol *= smoothstep(0.0, -0.1, WsunVecY); + + return auroraCol * atmosphereGround * auroraAmount * AURORA_BRIGHTNESS; +} diff --git a/shaders/lib/blocks.glsl b/shaders/lib/blocks.glsl index 814ff10..1f270c3 100644 --- a/shaders/lib/blocks.glsl +++ b/shaders/lib/blocks.glsl @@ -304,5 +304,6 @@ #define BLOCK_WALL_TALL_N_S_LOW_W_E 495 #define BLOCK_WALL_TALL_W_E_LOW_N_S 496 #define BLOCK_WALL_MAX 496 +#define BLOCK_SCULK_VEIN 497 #define BLOCK_END_PORTAL 500 #define BLOCK_SIGN 501 \ No newline at end of file diff --git a/shaders/lib/diffuse_lighting.glsl b/shaders/lib/diffuse_lighting.glsl index 8851551..3ad5a52 100644 --- a/shaders/lib/diffuse_lighting.glsl +++ b/shaders/lib/diffuse_lighting.glsl @@ -1,8 +1,69 @@ +#if defined MAIN_SHADOW_PASS && defined LPV_HANDHELD_SHADOWS && defined IS_LPV_ENABLED + float swapperlinZ2(float depth, float _near, float _far) { + return (2.0 * _near) / (_far + _near - depth * (_far - _near)); + } + + float SSRT_Handlight_Shadows(vec3 viewPos, bool depthCheck, vec3 lightDir, float noise, vec3 normals, bool hand){ + + if(hand) return 1.0; + + vec3 WlightDir = normalize((gbufferModelViewInverse*vec4(lightDir, 1.0)).xyz); + + float NdotL = dot(normals, WlightDir); + NdotL = smoothstep(0.0, 0.2, abs(NdotL)); + + float shadows = 1.0; + float samples = 16.0; + float SSS = 0.0; + + float _near = near; float _far = far*4.0; + + if (depthCheck) { + _near = dhNearPlane; + _far = dhFarPlane; + } + + vec3 position = toClipSpace3_DH(viewPos, depthCheck) ; + + //prevents the ray from going behind the camera + float rayLength = ((viewPos.z + lightDir.z * _far * sqrt(3.)) > -_near) ? (-_near - viewPos.z) / lightDir.z : _far * sqrt(3.); + + vec3 direction = toClipSpace3_DH(viewPos + lightDir*rayLength, depthCheck) - position; + direction.xyz = direction.xyz / max(max(abs(direction.x)/0.0015, abs(direction.y)/0.0015),400.0); //fixed step size + direction *= 6.0; + + position.xy *= RENDER_SCALE; + direction.xy *= RENDER_SCALE; + + vec3 newPos = position + direction*noise; + // literally shadow bias to fight shadow acne due to precision problems when comparing sampled depth and marched position + //newPos += direction*0.3; + + + for (int i = 0; i < int(10); i++) { + + float samplePos = texelFetch2D(depthtex2, ivec2(newPos.xy/texelSize).xy,0).x; + + #ifdef DISTANT_HORIZONS + if(depthCheck) samplePos = texelFetch2D(dhDepthTex1, ivec2(newPos.xy/texelSize),0).x; + #endif + + if(samplePos < newPos.z && samplePos > 0.0){// && (samplePos <= max(minZ,maxZ) && samplePos >= min(minZ,maxZ))){ + shadows = 0.0; + break; + } + + newPos += direction; + } + + return clamp(shadows*NdotL, 1.0-LPV_HANDHELD_SHADOWS_STRENGTH, 1.0); + } +#endif + #ifdef IS_LPV_ENABLED - vec3 GetHandLight(const in int itemId, const in vec3 playerPos, const in vec3 normal) { + vec3 GetHandLight(const in int itemId, const in vec3 playerPos, inout float lightRange) { vec3 lightFinal = vec3(0.0); vec3 lightColor = vec3(0.0); - float lightRange = 0.0; uvec2 blockData = texelFetch(texBlockData, itemId, 0).rg; vec4 lightColorRange = unpackUnorm4x8(blockData.r); @@ -24,6 +85,9 @@ vec3 doBlockLightLighting( vec3 lightColor, float lightmap, vec3 playerPos, vec3 lpvPos + #ifdef MAIN_SHADOW_PASS + , vec3 viewPos, bool depthCheck, float noise, vec3 normals, bool hand + #endif ){ lightmap = clamp(lightmap,0.0,1.0); @@ -54,13 +118,29 @@ vec3 doBlockLightLighting( #ifdef Hand_Held_lights // create handheld lightsources - const vec3 normal = vec3(0.0); // TODO - if (heldItemId > 0) - blockLight += GetHandLight(heldItemId, playerPos, normal); + if (heldItemId > 0){ + float lightRange = 0.0; + vec3 handLightCol = GetHandLight(heldItemId, playerPos, lightRange); - if (heldItemId2 > 0) - blockLight += GetHandLight(heldItemId2, playerPos, normal); + #if defined MAIN_SHADOW_PASS && defined LPV_HANDHELD_SHADOWS + if (lightRange > 0.0) handLightCol *= SSRT_Handlight_Shadows(viewPos, depthCheck, -(viewPos + vec3(-0.25, 0.2, 0.0)), noise, normals, hand); + #endif + + blockLight += handLightCol; + } + + + if (heldItemId2 > 0){ + float lightRange2 = 0.0; + vec3 handLightCol2 = GetHandLight(heldItemId2, playerPos, lightRange2); + + #if defined MAIN_SHADOW_PASS && defined LPV_HANDHELD_SHADOWS + if (lightRange2 > 0.0) handLightCol2 *= SSRT_Handlight_Shadows(viewPos, depthCheck, -(viewPos + vec3(0.25, 0.2, 0.0)), noise, normals, hand); + #endif + + blockLight += handLightCol2; + } #endif #endif diff --git a/shaders/lib/overworld_fog.glsl b/shaders/lib/overworld_fog.glsl index 5756e1e..a355916 100644 --- a/shaders/lib/overworld_fog.glsl +++ b/shaders/lib/overworld_fog.glsl @@ -128,7 +128,7 @@ vec4 GetVolumetricFog( // float totalAbsorbance = 1.0; vec3 totalAbsorbance = vec3(1.0); - float fogAbsorbance = 1.0; + // float fogAbsorbance = 1.0; // float atmosphereAbsorbance = 1.0; vec3 atmosphereAbsorbance = vec3(1.0); @@ -137,7 +137,7 @@ vec4 GetVolumetricFog( ///// ----- fog lighting //Mie phase + somewhat simulates multiple scattering (Horizon zero down cloud approx) float sunPhase = fogPhase(SdotV)*5.0;// phaseCloudFog(SdotV, 0.9) + phaseCloudFog(SdotV, 0.85) + phaseCloudFog(SdotV, 0.5) * 5.0; - float sunPhase2 = (phaseCloudFog(SdotV, 0.85) + phaseCloudFog(SdotV, 0.5)) * 5.0; + // float sunPhase2 = (phaseCloudFog(SdotV, 0.85) + phaseCloudFog(SdotV, 0.5)) * 5.0; float skyPhase = 2.0 + pow(1.0-pow(1.0-clamp(normalize(wpos).y*0.5+0.5,0.0,1.0),2.0),5.0)*2.0 ;//pow(clamp(normalize(wpos).y*0.5+0.5,0.0,1.0),4.0)*5.0; float rayL = phaseRayleigh(SdotV); @@ -173,7 +173,7 @@ vec4 GetVolumetricFog( float lightLevelZero = pow(clamp(eyeBrightnessSmooth.y/240.0 ,0.0,1.0),3.0); // SkyLightColor *= lightLevelZero*0.9 + 0.1; - vec3 finalsceneColor = vec3(0.0); + // vec3 finalsceneColor = vec3(0.0); for (int i = 0; i < SAMPLECOUNT; i++) { diff --git a/shaders/lib/settings.glsl b/shaders/lib/settings.glsl index a672a0c..06cbc9b 100644 --- a/shaders/lib/settings.glsl +++ b/shaders/lib/settings.glsl @@ -305,7 +305,7 @@ const float entityShadowDistanceMul = 0.25; // [0.01 0.02 0.03 0.04 0.05 0.10 0. #define SCREENSPACE_DIRECT_SSS_BLENDING 0.5 // [0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0] // #define Porosity -//#define Puddles // yes +#define PUDDLE_MODE 0 // [0 1 2 3] #define Puddle_Size 1.0 // [0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5] #define Puddle_Reflection_Sharpness 0.9 // [0.9 0.925 0.95 0.975 1.0] @@ -417,10 +417,18 @@ uniform vec3 unsigned_WmoonVecSmooth; #define SKY_GROUND -// #define OLD_STARS +#define OLD_STARS #define STARS_AMOUNT 1.0 // [0.5 0.75 1.0 1.25 1.5 1.75 2.0] #define STARS_BRIGHTNESS 1.0 // [0.0 0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0 3.0 4.0 5.0] +#define AURORA_LOCATION 1 // [0 1 2] +#define AURORA_MOON +#define AURORA_CHANCE 100 // [5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100] +#define AURORA_BRIGHTNESS 1.0 // [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.5 3.0 3.5 4.0 4.5 5.0 6.0 7.0 8.0 9.0 10.0] +#define AURORA_R 2.25 // [-5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0] +#define AURORA_G -0.5 // [-5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0] +#define AURORA_B 1.2 // [-5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0] + //////////////////////////////////////// // ----- CLOUD RELATED SETTINGS ----- // //////////////////////////////////////// @@ -779,7 +787,8 @@ const vec3 aerochrome_color = mix(vec3(1.0, 0.0, 0.0), vec3(0.715, 0.303, 0.631) #define FLASHLIGHT_R 1.0 // [0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0] #define FLASHLIGHT_G 0.9 // [0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0] #define FLASHLIGHT_B 0.8 // [0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0] - +#define FLASHLIGHT_SHADOWS +#define FLASHLIGHT_SHADOWS_STRENGTH 0.95 // [0.75 0.775 0.8 0.825 0.85 0.875 0.9 0.925 0.95 0.975 1.0] #ifdef FLASHLIGHT #endif @@ -995,6 +1004,12 @@ const vec3 aerochrome_color = mix(vec3(1.0, 0.0, 0.0), vec3(0.715, 0.303, 0.631) // ruining parts of the effect to make it more like vanilla floodfill // #define VANILLA_LIGHTMAP_MASK +#define LPV_HANDHELD_SHADOWS +#define LPV_HANDHELD_SHADOWS_STRENGTH 0.95 // [0.75 0.775 0.8 0.825 0.85 0.875 0.9 0.925 0.95 0.975 1.0] + +#ifdef LPV_HANDHELD_SHADOWS +#endif + //////////////////////////////// // ----- DEBUG SETTINGS ----- // //////////////////////////////// @@ -1076,7 +1091,7 @@ const vec3 aerochrome_color = mix(vec3(1.0, 0.0, 0.0), vec3(0.715, 0.303, 0.631) #undef CUMULONIMBUS_LIGHTNING #undef REALMOON #define ShaderSnow 0 -#undef Puddles +#define PUDDLE_MODE 0 #undef DEFERRED_SPECULAR #undef CUSTOM_MOON_ROTATION #define LIGHTNING_SHADOWS 0 @@ -1088,4 +1103,5 @@ const vec3 aerochrome_color = mix(vec3(1.0, 0.0, 0.0), vec3(0.715, 0.303, 0.631) #if CUMULONIMBUS == 0 && !defined CloudLayer0 && !defined CloudLayer1 && !defined CloudLayer2 && !defined CloudLayer3 #undef VOLUMETRIC_CLOUDS + #undef CLOUDS_SHADOWS #endif \ No newline at end of file diff --git a/shaders/lib/specular.glsl b/shaders/lib/specular.glsl index fa1ab3f..bb7234c 100644 --- a/shaders/lib/specular.glsl +++ b/shaders/lib/specular.glsl @@ -184,12 +184,12 @@ vec3 rayTraceSpeculars(vec3 dir, vec3 position, float dither, float quality, boo #if defined DISTANT_HORIZONS && defined DH_SCREENSPACE_REFLECTIONS #ifdef FULLRESDEPTH - float div = 1.0; // buffer is full res after first composite pass + // buffer is full res after first composite pass + float sampleDepth = texelFetch2D(colortex12, ivec2(spos.xy/texelSize),0).b/65000.0; #else - float div = 4.0; + float sampleDepth = texelFetch2D(colortex12, ivec2(spos.xy/texelSize/4.0),0).a/65000.0; #endif - float sampleDepth = texelFetch2D(colortex12, ivec2(spos.xy/texelSize/div),0).a/65000.0; float sp = invertLinearizeDepthFast(sqrt(sampleDepth)*dhFarPlane); #else float sampleDepth = texelFetch2D(colortex4, ivec2(spos.xy/texelSize/4.0),0).a/65000.0; diff --git a/shaders/lib/volumetricClouds.glsl b/shaders/lib/volumetricClouds.glsl index c0ef7f6..8224c8d 100644 --- a/shaders/lib/volumetricClouds.glsl +++ b/shaders/lib/volumetricClouds.glsl @@ -120,93 +120,99 @@ float getCloudShape(int LayerIndex, int LOD, in vec3 position, float minHeight, float largeCloud = 0.0; float smallCloud = 0.0; - if(LayerIndex == CIRRUS_LAYER){ - coverage = parameters.cirrus.x; - - vec2 coord = position.zx + 6.0*cloud_movement; - - vec2 curl = curl2D(0.00002 * coord) * 0.5 - + curl2D(0.00005 * coord) * 0.25 - + curl2D(0.00018 * coord) * 0.125; - - largeCloud = texture2D(noisetex, (position.xz + cloud_movement*2.0)/80000. * CloudLayer3_scale).b; - smallCloud = texture2D(noisetex, (0.000005 / CloudLayer3_scale) * coord).r; - - float detail_amplitude = 0.3; - float detail_frequency = 0.00002; - float curl_strength = 1.3; - - for (int i = 0; i < 3; ++i) { - float detail = texture2D(noisetex, coord * detail_frequency + curl * curl_strength).r; - - smallCloud -= detail * detail_amplitude; - - detail_amplitude *= 0.5; - detail_frequency *= 4.0; - curl_strength *= 2.7; - } - - smallCloud = abs(largeCloud* -0.4) + smallCloud; - - float val = coverage; - shape = min(max(val - smallCloud,0.0)/sqrt(val),1.0); - - if (position.y < (-0.0001 * minHeight + 0.8)*minHeight) shape = 0.0; - - return shape; - } - if(LayerIndex == ALTOSTRATUS_LAYER){ - coverage = parameters.altostratus.x; - coverage += Rain_coverage * rainStrength; - coverage += Thunder_coverage * thunderStrength; - - largeCloud = texture2D(noisetex, (position.xz + cloud_movement)/100000. * CloudLayer2_scale).b; - smallCloud = 1.0 - texture2D(noisetex, ((position.xz - cloud_movement)/7500. - vec2(1.0-largeCloud, -largeCloud)/7.0) * CloudLayer2_scale).b; - - smallCloud = largeCloud + smallCloud * 0.4 * clamp(0.9-largeCloud,0.0,1.0); - - float val = coverage; - shape = min(max(val - smallCloud,0.0)/sqrt(val),1.0); - shape *= shape; - - if (position.y < (-0.0001 * minHeight + 0.8)*minHeight) shape = 0.0; - - return shape; - } - - vec3 samplePos = position*vec3(1.0, 1.0/48.0, 1.0)/4.0; + vec3 samplePos = position*vec3(0.25, 0.005, 0.25); float tallness = maxHeight - minHeight; float posToMax = maxHeight - position.y; - if(LayerIndex == LARGECUMULUS_LAYER){ - coverage = parameters.largeCumulus.x; - coverage += Rain_coverage * rainStrength; - coverage += Thunder_coverage * thunderStrength; + switch (LayerIndex){ + default : { break; } + case CIRRUS_LAYER: { + coverage = parameters.cirrus.x; - largeCloud = texture2D(noisetex, (samplePos.zx + cloud_movement*2.0)/10000.0 * CloudLayer1_scale).b; - smallCloud = texture2D(noisetex, (samplePos.zx - cloud_movement*2.0)/2500.0 * CloudLayer1_scale).b; + vec2 coord = position.zx + 6.0*cloud_movement; + + vec2 curl = curl2D(0.00002 * coord) * 0.5 + + curl2D(0.00005 * coord) * 0.25 + + curl2D(0.00018 * coord) * 0.125; + + largeCloud = texture2D(noisetex, (position.xz + cloud_movement*2.0)/80000. * CloudLayer3_scale).b; + smallCloud = texture2D(noisetex, (0.000005 / CloudLayer3_scale) * coord).r; - smallCloud = abs(largeCloud* -0.7) + smallCloud; + float detail_amplitude = 0.3; + float detail_frequency = 0.00002; + float curl_strength = 1.3; - float val = coverage; - shape = min(max(val - smallCloud,0.0)/sqrt(val),1.0); + for (int i = 0; i < 3; ++i) { + float detail = texture2D(noisetex, coord * detail_frequency + curl * curl_strength).r; - } - if(LayerIndex == SMALLCUMULUS_LAYER){ - coverage = parameters.smallCumulus.x; - coverage += Rain_coverage * rainStrength; - coverage += Thunder_coverage * thunderStrength; + smallCloud -= detail * detail_amplitude; - largeCloud = texture2D(noisetex, (samplePos.xz + cloud_movement)/5000.0 * CloudLayer0_scale).b; - smallCloud = 1.0-texture2D(noisetex, (samplePos.xz - cloud_movement)/500.0 * CloudLayer0_scale).r; + detail_amplitude *= 0.5; + detail_frequency *= 4.0; + curl_strength *= 2.7; + } + + smallCloud = abs(largeCloud* -0.4) + smallCloud; - smallCloud = abs(largeCloud-0.6) + smallCloud*smallCloud; + float val = coverage; + shape = min(max(val - smallCloud,0.0)/sqrt(val),1.0); - float val = coverage; - shape = min(max(val - smallCloud,0.0)/sqrt(val),1.0); - - // shape = abs(largeCloud*2.0 - 1.2)*0.5 - (1.0-smallCloud); + if (position.y < (-0.0001 * minHeight + 0.8)*minHeight) shape = 0.0; + + return shape; + break; } + + case ALTOSTRATUS_LAYER: { + coverage = parameters.altostratus.x; + coverage += Rain_coverage * rainStrength; + coverage += Thunder_coverage * thunderStrength; + + largeCloud = texture2D(noisetex, (position.xz + cloud_movement)/100000. * CloudLayer2_scale).b; + smallCloud = 1.0 - texture2D(noisetex, ((position.xz - cloud_movement)/7500. - vec2(1.0-largeCloud, -largeCloud)/7.0) * CloudLayer2_scale).b; + + smallCloud = largeCloud + smallCloud * 0.4 * clamp(0.9-largeCloud,0.0,1.0); + + float val = coverage; + shape = min(max(val - smallCloud,0.0)/sqrt(val),1.0); + shape *= shape; + + if (position.y < (-0.0001 * minHeight + 0.8)*minHeight) shape = 0.0; + + return shape; + break; } + + case LARGECUMULUS_LAYER: { + coverage = parameters.largeCumulus.x; + coverage += Rain_coverage * rainStrength; + coverage += Thunder_coverage * thunderStrength; + + + largeCloud = texture2D(noisetex, (samplePos.zx + cloud_movement*2.0)/10000.0 * CloudLayer1_scale).b; + smallCloud = texture2D(noisetex, (samplePos.zx - cloud_movement*2.0)/2500.0 * CloudLayer1_scale).b; + + smallCloud = abs(largeCloud* -0.7) + smallCloud; + + float val = coverage; + shape = min(max(val - smallCloud,0.0)/sqrt(val),1.0); + + break; } + + case SMALLCUMULUS_LAYER: { + coverage = parameters.smallCumulus.x; + coverage += Rain_coverage * rainStrength; + coverage += Thunder_coverage * thunderStrength; + + largeCloud = texture2D(noisetex, (samplePos.xz + cloud_movement)/5000.0 * CloudLayer0_scale).b; + smallCloud = 1.0-texture2D(noisetex, (samplePos.xz - cloud_movement)/500.0 * CloudLayer0_scale).r; + + smallCloud = abs(largeCloud-0.6) + smallCloud*smallCloud; + + float val = coverage; + shape = min(max(val - smallCloud,0.0)/sqrt(val),1.0); + + // shape = abs(largeCloud*2.0 - 1.2)*0.5 - (1.0-smallCloud); + break; } } // clamp density of the cloud within its upper/lower bounds @@ -237,22 +243,26 @@ float getCloudShape(int LayerIndex, int LOD, in vec3 position, float minHeight, float erosion = 0.0; float omShape = 1.0 - shape; - if(LayerIndex == SMALLCUMULUS_LAYER){ - erosion += (1.0-densityAtPos(samplePos * CloudLayer0_detail * CloudLayer0_scale / 3.0)) * sqrt(omShape); + switch (LayerIndex){ + default : { break; } - float falloff = 1.0 - clamp((posToMax)/100.0,0.0,1.0); - erosion += abs(densityAtPos(samplePos * CloudLayer0_detail * CloudLayer0_scale) - falloff) * 0.75 * (omShape) * (1.0-falloff*0.25); + case SMALLCUMULUS_LAYER: { + erosion += (1.0-densityAtPos(samplePos * CloudLayer0_detail * CloudLayer0_scale / 3.0)) * sqrt(omShape); - erosion = erosion*erosion*erosion*erosion; - } - if(LayerIndex == LARGECUMULUS_LAYER){ - erosion += (1.0 - densityAtPos(samplePos * CloudLayer1_detail * CloudLayer1_scale / 4.5)) * sqrt(omShape); + float falloff = 1.0 - clamp((posToMax)/100.0,0.0,1.0); + erosion += abs(densityAtPos(samplePos * CloudLayer0_detail * CloudLayer0_scale) - falloff) * 0.75 * (omShape) * (1.0-falloff*0.25); - float falloff = 1.0 - clamp((posToMax)/200.0,0.0,1.0); - erosion += abs(densityAtPos(samplePos * CloudLayer1_detail * CloudLayer1_scale) - falloff) * 0.75 * (omShape) * (1.0-falloff*0.5); + erosion = erosion*erosion*erosion*erosion; + break; } + case LARGECUMULUS_LAYER: { + erosion += (1.0 - densityAtPos(samplePos * CloudLayer1_detail * CloudLayer1_scale / 4.5)) * sqrt(omShape); - erosion = erosion*erosion*erosion*erosion; - } + float falloff = 1.0 - clamp((posToMax)/200.0,0.0,1.0); + erosion += abs(densityAtPos(samplePos * CloudLayer1_detail * CloudLayer1_scale) - falloff) * 0.75 * (omShape) * (1.0-falloff*0.5); + + erosion = erosion*erosion*erosion*erosion; + break; } + } return max(shape - erosion*erodeAmount,0.0); @@ -401,20 +411,21 @@ float GetCloudShadow(vec3 playerPos, vec3 sunVector){ float totalShadow = getPlanetShadow(playerPos, sunVector); vec3 startPosition = playerPos; + vec3 startOffset = sunVector / abs(sunVector.y); #ifdef CLOUDS_SHADOWS float cloudShadows = 0.0; #ifdef CloudLayer0 - startPosition = playerPos + sunVector / abs(sunVector.y) * max((CloudLayer0_height + 20.0) - playerPos.y, 0.0); - cloudShadows = getCloudShape(SMALLCUMULUS_LAYER, 0, startPosition, CloudLayer0_height, CloudLayer0_height + CloudLayer0_tallness)*(getRainDensity(parameters.smallCumulus.y)); + startPosition = playerPos + startOffset * max((CloudLayer0_height + 20.0) - playerPos.y, 0.0); + cloudShadows = getCloudShape(SMALLCUMULUS_LAYER, 0, startPosition, CloudLayer0_height, CloudLayer0_height + CloudLayer0_tallness/CloudLayer0_scale)*(getRainDensity(parameters.smallCumulus.y)); #endif #ifdef CloudLayer1 - startPosition = playerPos + sunVector / abs(sunVector.y) * max((CloudLayer1_height + 30.0) - playerPos.y, 0.0); - cloudShadows += getCloudShape(LARGECUMULUS_LAYER, 0, startPosition, CloudLayer1_height, CloudLayer1_height + CloudLayer1_tallness)*(getRainDensity(parameters.largeCumulus.y)); + startPosition = playerPos + startOffset * max((CloudLayer1_height + 30.0) - playerPos.y, 0.0); + cloudShadows += getCloudShape(LARGECUMULUS_LAYER, 0, startPosition, CloudLayer1_height, CloudLayer1_height + CloudLayer1_tallness/CloudLayer1_scale)*(getRainDensity(parameters.largeCumulus.y)); #endif #ifdef CloudLayer2 - startPosition = playerPos + sunVector / abs(sunVector.y) * max(CloudLayer2_height - playerPos.y, 0.0); + startPosition = playerPos + startOffset * max(CloudLayer2_height - playerPos.y, 0.0); cloudShadows += getCloudShape(ALTOSTRATUS_LAYER, 0, startPosition, CloudLayer2_height, CloudLayer2_height + 5.0)*parameters.altostratus.y * (1.0-abs(WsunVec.y)); #endif #if CUMULONIMBUS > 0 @@ -435,17 +446,18 @@ float GetCloudShadow(vec3 playerPos, vec3 sunVector){ } #ifndef CLOUDSHADOWSONLY +uniform sampler2D colortex4; #if CLOUD_PHASE == 0 // Henyey-Greenstein float phaseCloud(float x, float g){ float gg = g * g; - return (gg * -0.25 + 0.25) * pow(-2.0 * (g * x) + (gg + 1.0), -1.5); + return (gg * -0.25 + 0.25) * pow(-2.0 * (g * x) + (gg + 1.0), -1.5) / 3.14; } #else // Cornette-Shanks float phaseCloud(float x, float g){ - return (3.0 * (1.0 - g * g) * (1.0 + x * x)) / (4.0 * 3.14159265359 * 2.0 * (2.0 + g * g) * pow(1.0 + g * g - 2.0 * g * x, 3.0/2.0)); + return (3.0 * (1.0 - g * g) * (1.0 + x * x)) / (25.133 * (2.0 + g * g) * pow(1.0 + g * g - 2.0 * g * x, 1.5)); } #endif @@ -472,23 +484,32 @@ float getCloudScattering( float sunVis = smoothstep(-0.06, 0.01, sunElevation); sunVis = sunVis * sunVis; #if defined CAELUM_SUPPORT || !defined CUSTOM_MOON_ROTATION - float moonVis = smoothstep(-0.04, 0.015, -moonElevation); + float moonVis = smoothstep(0.0, 0.075, -moonElevation); #else float moonVis = smoothstep(0.0, 0.2, moonVector.y); #endif moonVis = moonVis * moonVis; + moonVis *= smoothstep(0.06, -0.06, sunElevation); + float isLarge = 80; vec3 lightVec = normalize(mix(moonVector, sunVector, smoothstep(-0.06, 0.06, sunElevation))); for (int i = 0; i < samples; i++){ if((LayerIndex == ALTOSTRATUS_LAYER) || (LayerIndex == CIRRUS_LAYER)){ shadowRayPosition = rayPosition + sunVis * sunVector * (1.0 + i * dither) / (pow(abs(sunVector.y*0.5),3.0) * 0.995 + 0.005) + moonVis * moonVector * (1.0 + i * dither) / (pow(abs(moonVector.y*0.5),3.0) * 0.995 + 0.005); - }else if((LayerIndex == LARGECUMULUS_LAYER) || (LayerIndex == SMALLCUMULUS_LAYER)) { + } else + #if CUMULONIMBUS > 0 + if((LayerIndex == LARGECUMULUS_LAYER) || (LayerIndex == SMALLCUMULUS_LAYER)) + #endif + { shadowRayPosition = rayPosition + lightVec * (1.0 + i + dither)*20.0; - } else { + } + #if CUMULONIMBUS > 0 + else { shadowRayPosition = rayPosition + lightVec * (1.0 + i + dither)*isLarge; } + #endif // float fadeddensity = density * pow(clamp((shadowRayPosition.y - minHeight)/(max(maxHeight-minHeight,1.0)*0.25),0.0,1.0),2.0); #if CUMULONIMBUS > 0 @@ -513,31 +534,42 @@ vec3 getCloudLighting( float sunShadowMask, vec3 directLightCol, - vec3 directLightCol_multi, vec3 directLightCol2, - vec3 directLightCol_multi2, float indirectShadowMask, vec3 indirectLightCol, - vec3 rayPosition + vec3 rayPosition, + + float backScatterPhase, + vec4 phaseLevels, + + float backScatterPhase2, + vec4 phaseLevels2 ){ - vec3 heightScal = vec3(mix(1.0, 0.5, clamp(rayPosition.y, 0.0, 7000.0)/7000)); + vec3 heightScal = vec3(mix(1.0, 0.5, clamp(rayPosition.y, 0.0, 7000.0)/7000.0)); directLightCol = pow(directLightCol, heightScal); - directLightCol_multi = pow(directLightCol_multi, heightScal); directLightCol2 = pow(directLightCol2, heightScal); - directLightCol_multi2 = pow(directLightCol_multi2, heightScal); - #ifdef ALTERNATE_POWDER_EFFECT - float powderEffect = 1.0-exp(-10.0*shapeFaded); powderEffect *= powderEffect; powderEffect *= 2.0; - #else - float powderEffect = 1.0 - exp(-8.0*shapeFaded); - #endif - vec3 directScattering = directLightCol_multi * powderEffect * exp(-3.0*sunShadowMask) + directLightCol * exp(-10.0*sunShadowMask); - directScattering += directLightCol_multi2 * powderEffect * exp(-3.0*sunShadowMask) + directLightCol2 * exp(-10.0*sunShadowMask); + float beerCoef = -4.0; + float powder = min(exp(beerCoef*exp(beerCoef*shapeFaded)) * 3.5, 1.0); + float backscatter = powder * backScatterPhase; + float forwardscatter = mix(mix(phaseLevels.x, phaseLevels.y, powder), mix(phaseLevels.z, phaseLevels.w, powder), powder); + + float backscatter2 = powder * backScatterPhase2; + float forwardscatter2 = mix(mix(phaseLevels2.x, phaseLevels2.y, powder), mix(phaseLevels2.z, phaseLevels2.w, powder), powder); + + // backscatter = powder * phaseCloud(-backScatterPhase, 0.25) * 2.0; + // forwardscatter = phaseCloud(backScatterPhase, mix(0.9,0.1,powder)); + + float expBeer = 6.28 * exp((beerCoef-1.0)*sunShadowMask); + + vec3 directScattering = expBeer * directLightCol * (forwardscatter + backscatter); + directScattering += expBeer * directLightCol2 * (forwardscatter2 + backscatter2); + vec3 indirectScattering = indirectLightCol * mix(1.0, exp2(-5.0*shape), indirectShadowMask*indirectShadowMask); // return indirectScattering; @@ -545,8 +577,6 @@ vec3 getCloudLighting( return indirectScattering + directScattering; } -uniform sampler2D colortex4; - vec4 raymarchCloud( int LayerIndex, int samples, @@ -560,19 +590,35 @@ vec4 raymarchCloud( vec3 sunVector, vec3 moonVector, vec3 sunScattering, - vec3 sunMultiScattering, vec3 moonScattering, - vec3 moonMultiScattering, vec3 skyScattering, float referenceDistance, vec3 sampledSkyCol, - inout vec2 cloudPlaneDistance + inout vec2 cloudPlaneDistance, + + float backScatterPhase, + vec4 phaseLevels, + + float backScatterPhase2, + vec4 phaseLevels2 ){ vec3 color = vec3(0.0); float totalAbsorbance = 1.0; + #if AURORA_LOCATION > 0 + #ifdef LUT + const float mult = 0.375*AURORA_BRIGHTNESS; + #else + const float mult = 0.015*AURORA_BRIGHTNESS; + #endif + + vec3 auroraColor = sin(vec3(AURORA_R, AURORA_G, AURORA_B) + 0.63) * 0.5 + 0.5; + + vec3 auroraLighting = mult*auroraColor * auroraAmount * smoothstep(0.0, -0.1, sunVector.y) * smoothstep(0.1, 0.0, moonVector.y); + #endif + // if(LayerIndex == SMALLCUMULUS_LAYER || LayerIndex == LARGECUMULUS_LAYER || LayerIndex == CUMULONIMBUS_LAYER) { // float planetShadow = getPlanetShadow(rayPosition, sunVector); // sunScattering *= planetShadow; @@ -627,11 +673,14 @@ vec4 raymarchCloud( if(shapeWithDensity > 1e-5){ // can add the initial cloud shape sample for a free shadow starting step :D - float sunShadowMask = (shapeWithDensity + getCloudScattering(LayerIndex, rayPosition, sunVector, moonVector, dither, minHeight, maxHeight, density)) * (1.0-abs(WsunVec.y)); + float sunShadowMask = getCloudScattering(LayerIndex, rayPosition, sunVector, moonVector, dither, minHeight, maxHeight, density) * (1.0-abs(WsunVec.y)); float indirectShadowMask = 0.5; - vec3 lighting = getCloudLighting(LayerIndex, shapeWithDensity, shapeWithDensity, sunShadowMask, sunScattering, sunMultiScattering, moonScattering, moonMultiScattering, indirectShadowMask, skyScattering, rayPosition); + vec3 lighting = getCloudLighting(LayerIndex, shapeWithDensity, shapeWithDensity, sunShadowMask, sunScattering, moonScattering, indirectShadowMask, skyScattering, rayPosition, backScatterPhase, phaseLevels, backScatterPhase2, phaseLevels2); + #if AURORA_LOCATION > 0 + lighting += auroraLighting; + #endif newPos.xz /= max(newPos.y,0.0)*0.0025 + 1.0; newPos.y = min(newPos.y,0.0); @@ -664,12 +713,14 @@ vec4 raymarchCloud( if (density < 0.01) return vec4(color, totalAbsorbance); - float skylightOcclusion = 1.0; - #if defined CloudLayer1 && defined CloudLayer0 - if(LayerIndex == SMALLCUMULUS_LAYER) { - float upperLayerOcclusion = getCloudShape(LARGECUMULUS_LAYER, 0, rayPosition + vec3(0.0,1.0,0.0) * max((CloudLayer1_height+20) - rayPosition.y,0.0), CloudLayer1_height, CloudLayer1_height+100.0); - skylightOcclusion = mix(mix(0.0,0.2,densityLarge), 1.0, pow(1.0 - upperLayerOcclusion*densityLarge,2)); - } + #if AURORA_LOCATION == 0 + float skylightOcclusion = 1.0; + #if defined CloudLayer1 && defined CloudLayer0 + if(LayerIndex == SMALLCUMULUS_LAYER) { + float upperLayerOcclusion = getCloudShape(LARGECUMULUS_LAYER, 0, rayPosition + vec3(0.0,1.0,0.0) * max((CloudLayer1_height+20) - rayPosition.y,0.0), CloudLayer1_height, CloudLayer1_height+100.0); + skylightOcclusion = mix(mix(0.0,0.2,densityLarge), 1.0, pow(1.0 - upperLayerOcclusion*densityLarge,2)); + } + #endif #endif vec3 lightningPos = vec3(0.0); @@ -719,11 +770,20 @@ vec4 raymarchCloud( // check if the pixel has visible clouds before doing work. if(shapeWithDensityFaded > 1e-5){ - + #if AURORA_LOCATION > 0 + float skylightOcclusion = 1.0; + #if defined CloudLayer1 && defined CloudLayer0 + if(LayerIndex == SMALLCUMULUS_LAYER) { + float upperLayerOcclusion = getCloudShape(LARGECUMULUS_LAYER, 0, rayPosition + vec3(0.0,1.0,0.0) * max((CloudLayer1_height+20) - rayPosition.y,0.0), CloudLayer1_height, CloudLayer1_height+CloudLayer1_height); + skylightOcclusion = mix(mix(0.0,0.2,densityLarge), 1.0, pow(1.0 - upperLayerOcclusion*densityLarge,5)); + } + #endif + #endif + // can add the initial cloud shape sample for a free shadow starting step :D float indirectShadowMask = 1.0 - min(max(rayHeightInCloud,0.0) / max(tallness,1.0), 1.0); - float sunShadowMask = shapeWithDensity + getCloudScattering(LayerIndex, rayPosition, sunVector, moonVector, dither, minHeight, maxHeight, density); + float sunShadowMask = getCloudScattering(LayerIndex, rayPosition, sunVector, moonVector, dither, minHeight, maxHeight, density); vec3 shadowStartPos = vec3(0.0); // do cloud shadows from one layer to another @@ -739,8 +799,8 @@ vec4 raymarchCloud( if(LayerIndex != CUMULONIMBUS_LAYER){ float distanceFactor = clamp(degrees(acos(dot(vec3(0.0, 1.0, 0.0), mainLightVec))), 45.0, 90.0) - 45.0; - shadowStartPos = rayPosition + mainLightVec * 9000; - sunShadowMask += getCumulonimbusShape(0, shadowStartPos, 600, 4600+shadowStartPos.y).x * 3.0; + shadowStartPos = rayPosition + mainLightVec * 9000.; + sunShadowMask += getCumulonimbusShape(0, shadowStartPos, 600., 4600.+shadowStartPos.y).x * 3.0; } #endif // altostratus layer -> all cumulus layers @@ -749,7 +809,7 @@ vec4 raymarchCloud( sunShadowMask += getCloudShape(ALTOSTRATUS_LAYER, 0, shadowStartPos, CloudLayer2_height, CloudLayer2_height) * parameters.altostratus.y * (1.0-abs(mainLightVec.y)); #endif - vec3 lighting = getCloudLighting(LayerIndex, shapeWithDensity, shapeWithDensityFaded, sunShadowMask, sunScattering, sunMultiScattering, moonScattering, moonMultiScattering, indirectShadowMask, skyScattering * skylightOcclusion, rayPosition); + vec3 lighting = getCloudLighting(LayerIndex, shapeWithDensity, shapeWithDensityFaded, sunShadowMask, sunScattering, moonScattering, indirectShadowMask, skyScattering*skylightOcclusion, rayPosition, backScatterPhase, phaseLevels, backScatterPhase2, phaseLevels2); float lightningIntensity = 0.0; @@ -779,6 +839,10 @@ vec4 raymarchCloud( } #endif + #if AURORA_LOCATION > 0 + lighting += auroraLighting * min(max(rayHeightInCloud,0.0) / max(tallness,1.0), 1.0) * skylightOcclusion*skylightOcclusion; + #endif + newPos.xz /= max(newPos.y,0.0)*0.0025 + 1.0; newPos.y = min(newPos.y,0.0); @@ -919,9 +983,9 @@ vec4 GetVolumetricClouds( float startDistance = length(playerPos); float sunVis = smoothstep(-0.06, 0.1, sunElevation); - sunVis = sunVis * sunVis; + #if defined CAELUM_SUPPORT || !defined CUSTOM_MOON_ROTATION - float moonVis = smoothstep(-0.04, 0.015, -moonElevation); + float moonVis = smoothstep(0.0, 0.075, -moonElevation); #else float moonVis = smoothstep(0.0, 0.2, moonVector.y); #endif @@ -933,20 +997,44 @@ vec4 GetVolumetricClouds( #endif ///------- do color stuff outside of the raymarcher loop - vec3 sunScattering = directLightCol * (phaseCloud(SdotV, 0.85) + phaseCloud(SdotV, 0.75)); - vec3 sunMultiScattering = directLightCol; - vec3 moonScattering = directLightCol2 * (phaseCloud(SdotV2, 0.85) + phaseCloud(SdotV2, 0.75)); - vec3 moonMultiScattering = directLightCol2; + // vec3 sunScattering = directLightCol * (phaseCloud(SdotV, 0.85) + phaseCloud(SdotV, 0.75)); + // vec3 sunMultiScattering = directLightCol; + // vec3 moonScattering = directLightCol2 * (phaseCloud(SdotV2, 0.85) + phaseCloud(SdotV2, 0.75)); + // vec3 moonMultiScattering = directLightCol2; + + // the idea is to interpolate between 4 HG function calls with different G parameters + + float backScatterPhase = 0.0; + vec4 phaseLevels = vec4(0.0); + + if(sunVis > 0.0) { + backScatterPhase = phaseCloud(-SdotV, 0.25) * 2.0; + phaseLevels = vec4(phaseCloud(SdotV, 0.80), phaseCloud(SdotV, 0.55), phaseCloud(SdotV, 0.35), phaseCloud(SdotV, 0.10)); + } + + float backScatterPhase2 = 0.0; + vec4 phaseLevels2 = vec4(0.0); + + if(moonVis > 0.0) { + backScatterPhase2 = phaseCloud(-SdotV2, 0.25) * 2.0; + phaseLevels2 = vec4(phaseCloud(SdotV2, 0.80), phaseCloud(SdotV2, 0.55), phaseCloud(SdotV2, 0.35), phaseCloud(SdotV2, 0.10)); + } + + // backScatterPhase = SdotV; + + vec3 sunScattering = directLightCol * sunVis * sunVis; + vec3 moonScattering = directLightCol2 * moonVis * moonVis * (1.0 - sunVis * sunVis); + vec3 skyScattering = indirectLightCol * (1.0 + sunVis); - vec3 moonScattering3 = moonScattering * moonVis; - vec3 moonMultiScattering3 = moonMultiScattering * moonVis; - - moonVis = moonVis * moonVis; - vec3 sunScattering2 = sunScattering * sunVis; - vec3 sunMultiScattering2 = sunMultiScattering * sunVis; - vec3 moonScattering2 = moonScattering * moonVis; - vec3 moonMultiScattering2 = moonMultiScattering * moonVis; + // vec3 moonScattering3 = moonScattering * moonVis; + // vec3 moonMultiScattering3 = moonMultiScattering * moonVis; + // + // moonVis = moonVis * moonVis; + // vec3 sunScattering2 = sunScattering * sunVis; + // vec3 sunMultiScattering2 = sunMultiScattering * sunVis; + // vec3 moonScattering2 = moonScattering * moonVis; + // vec3 moonMultiScattering2 = moonMultiScattering * moonVis; ////------- RENDER SMALL CUMULUS CLOUDS vec4 smallCumulusClouds = cloudColor; @@ -954,7 +1042,7 @@ vec4 GetVolumetricClouds( vec2 cloudLayer0_Distance = vec2(startDistance, 1.0); #ifdef CloudLayer0 float smallCumulusDistance = length(rayPosition - cameraPosition); - smallCumulusClouds = raymarchCloud(SMALLCUMULUS_LAYER, samples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering2, sunMultiScattering2, moonScattering2, moonMultiScattering2, skyScattering, lViewPosM, sampledSkyCol, cloudLayer0_Distance); + smallCumulusClouds = raymarchCloud(SMALLCUMULUS_LAYER, samples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering, moonScattering, skyScattering, lViewPosM, sampledSkyCol, cloudLayer0_Distance, backScatterPhase, phaseLevels, backScatterPhase2, phaseLevels2); #endif ////------- RENDER LARGE CUMULUS CLOUDS @@ -972,7 +1060,7 @@ vec4 GetVolumetricClouds( rayDirection = NormPlayerPos.xyz * (cloudheight/length(NormPlayerPos.xyz/cloudDist)/samples); rayPosition = getRayOrigin(rayDirection, cameraPosition, dither.y, minHeight, maxHeight); - largeCumulusClouds = raymarchCloud(LARGECUMULUS_LAYER, samples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering2, sunMultiScattering2, moonScattering2, moonMultiScattering2, skyScattering, lViewPosM, sampledSkyCol, cloudLayer1_Distance); + largeCumulusClouds = raymarchCloud(LARGECUMULUS_LAYER, samples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering, moonScattering, skyScattering, lViewPosM, sampledSkyCol, cloudLayer1_Distance, backScatterPhase, phaseLevels, backScatterPhase2, phaseLevels2); } float largeCumulusDistance = length(rayPosition - cameraPosition); #endif @@ -992,19 +1080,19 @@ vec4 GetVolumetricClouds( rayDirection = NormPlayerPos.xyz * (cloudheight/length(NormPlayerPos.xyz/cloudDist)/cumulonimbusSamples); rayPosition = getRayOrigin(rayDirection, cameraPosition, dither.y, minHeight, maxHeight); - cumulonimbusClouds = raymarchCloud(CUMULONIMBUS_LAYER, cumulonimbusSamples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering2, sunMultiScattering2, moonScattering2, moonMultiScattering2, skyScattering, lViewPosM, sampledSkyCol, cloudLayer4_Distance); + cumulonimbusClouds = raymarchCloud(CUMULONIMBUS_LAYER, cumulonimbusSamples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering, moonScattering, skyScattering, lViewPosM, sampledSkyCol, cloudLayer4_Distance, backScatterPhase, phaseLevels, backScatterPhase2, phaseLevels2); } float cumulonimbusDistance = length(rayPosition - cameraPosition); #endif - #if defined CAELUM_SUPPORT || !defined CUSTOM_MOON_ROTATION - moonVis = smoothstep(-0.04, 0.015, -moonElevation); - #else - moonVis = smoothstep(0.0, 0.2, moonVector.y); - #endif - - moonScattering2 = moonScattering * moonVis; - moonMultiScattering2 = moonMultiScattering * moonVis; + // #if defined CAELUM_SUPPORT || !defined CUSTOM_MOON_ROTATION + // moonVis = smoothstep(-0.04, 0.015, -moonElevation); + // #else + // moonVis = smoothstep(0.0, 0.2, moonVector.y); + // #endif + // + // moonScattering2 = moonScattering * moonVis; + // moonMultiScattering2 = moonMultiScattering * moonVis; ////------- RENDER ALTOSTRATUS CLOUDS vec4 altoStratusClouds = cloudColor; @@ -1020,7 +1108,7 @@ vec4 GetVolumetricClouds( rayDirection = NormPlayerPos.xyz * (cloudheight/length(NormPlayerPos.xyz/cloudDist)); rayPosition = getRayOrigin(rayDirection, cameraPosition, dither.y, minHeight, maxHeight); - altoStratusClouds = raymarchCloud(ALTOSTRATUS_LAYER, samples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering, sunMultiScattering, moonScattering3, moonMultiScattering3, skyScattering, lViewPosM, sampledSkyCol, cloudLayer2_Distance); + altoStratusClouds = raymarchCloud(ALTOSTRATUS_LAYER, samples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering, moonScattering, skyScattering, lViewPosM, sampledSkyCol, cloudLayer2_Distance, backScatterPhase, phaseLevels, backScatterPhase2, phaseLevels2); } #endif @@ -1038,7 +1126,7 @@ vec4 GetVolumetricClouds( rayDirection = NormPlayerPos.xyz * (cloudheight/length(NormPlayerPos.xyz/cloudDist)); rayPosition = getRayOrigin(rayDirection, cameraPosition, dither.y, minHeight, maxHeight); - cirrusClouds = raymarchCloud(CIRRUS_LAYER, samples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering, sunMultiScattering, moonScattering3, moonMultiScattering3, skyScattering, lViewPosM, sampledSkyCol, cloudLayer3_Distance); + cirrusClouds = raymarchCloud(CIRRUS_LAYER, samples, rayPosition, rayDirection, dither.x, minHeight, maxHeight, unsignedSunVec, unsignedMoonVec, sunScattering, moonScattering, skyScattering, lViewPosM, sampledSkyCol, cloudLayer3_Distance, backScatterPhase, phaseLevels, backScatterPhase2, phaseLevels2); } #endif diff --git a/shaders/shaders.properties b/shaders/shaders.properties index 6bb31ad..f7689f6 100644 --- a/shaders/shaders.properties +++ b/shaders/shaders.properties @@ -4,13 +4,13 @@ #=============== EVERYTHING BELOW HERE IS NOT FOR CUSTOM SCENE CONTROLLER STUFF AND SHOULD NOT BE MODIFIED UNLESS YOU KNOW EXACTLY WHAT YOU ARE DOING =============== #==================================================================================================================================================================== -profile.POTATO = WATER_INTERACTION:0 WATER_SIM_DISTANCE:1 WATER_SIM_SCALE:0 WATER_SIM_FRAMERATE:30 !MOON_NORMALS RAINBOW:0 !CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:0 !END_ISLAND_LIGHT CloudLayer0_distance:10000.0 CloudLayer1_distance:10000.0 !RIPPLE_PUDDLES !RIPPLE_WATER !Puddles ShaderSnow:0 CUMULONIMBUS:0 CloudLayer0 !CloudLayer1 !CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.25 indirect_effect:0 RAY_COUNT:4 VL_SAMPLES:4 !REALMOON shadowMapResolution:512 shadowDistance:64.0 !DH_SCREENSPACE_REFLECTIONS !LPV_ENABLED !SAND_STORMS !SNOW_STORMS TAA_UPSCALING SCALE_FACTOR:0.7 SHARPENING:0.55 !FORWARD_ENVIORNMENT_REFLECTION -profile.VERY_LOW = WATER_INTERACTION:1 WATER_SIM_DISTANCE:1 WATER_SIM_SCALE:0 WATER_SIM_FRAMERATE:30 !MOON_NORMALS RAINBOW:0 !CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:0 !END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 !RIPPLE_PUDDLES !RIPPLE_WATER !Puddles ShaderSnow:0 CUMULONIMBUS:0 CloudLayer0 !CloudLayer1 !CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.25 indirect_effect:0 RAY_COUNT:4 VL_SAMPLES:4 REALMOON shadowMapResolution:1024 shadowDistance:96.0 !DH_SCREENSPACE_REFLECTIONS !LPV_ENABLED !SAND_STORMS !SNOW_STORMS TAA_UPSCALING SCALE_FACTOR:0.8 SHARPENING:0.5 !FORWARD_ENVIORNMENT_REFLECTION -profile.LOW = WATER_INTERACTION:2 WATER_SIM_DISTANCE:2 WATER_SIM_SCALE:0 WATER_SIM_FRAMERATE:30 !MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:0 !END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 !RIPPLE_PUDDLES !RIPPLE_WATER !Puddles ShaderSnow:0 CUMULONIMBUS:0 CloudLayer0 !CloudLayer1 CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.25 indirect_effect:1 RAY_COUNT:4 VL_SAMPLES:6 REALMOON shadowMapResolution:1536 shadowDistance:112.0 !DH_SCREENSPACE_REFLECTIONS !LPV_ENABLED SAND_STORMS SNOW_STORMS TAA_UPSCALING SCALE_FACTOR:0.9 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION -profile.MEDIUM = WATER_INTERACTION:2 WATER_SIM_DISTANCE:2 WATER_SIM_SCALE:1 WATER_SIM_FRAMERATE:30 MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:1 END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 !RIPPLE_PUDDLES RIPPLE_WATER !Puddles ShaderSnow:0 CUMULONIMBUS:0 CloudLayer0 CloudLayer1 CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.5 indirect_effect:1 RAY_COUNT:4 SAMPLES:6 REALMOON shadowMapResolution:2048 shadowDistance:128.0 DH_SCREENSPACE_REFLECTIONS !LPV_ENABLED SAND_STORMS SNOW_STORMS !TAA_UPSCALING SCALE_FACTOR:0.75 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION -profile.HIGH = WATER_INTERACTION:2 WATER_SIM_DISTANCE:2 WATER_SIM_SCALE:1 WATER_SIM_FRAMERATE:60 MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:1 END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 RIPPLE_PUDDLES RIPPLE_WATER Puddles ShaderSnow:1 CUMULONIMBUS:0 CloudLayer0 CloudLayer1 CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.5 indirect_effect:1 RAY_COUNT:4 SAMPLES:8 REALMOON shadowMapResolution:2560 shadowDistance:128.0 DH_SCREENSPACE_REFLECTIONS LPV_ENABLED SAND_STORMS SNOW_STORMS !TAA_UPSCALING SCALE_FACTOR:0.75 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION -profile.VERY_HIGH = WATER_INTERACTION:2 WATER_SIM_DISTANCE:3 WATER_SIM_SCALE:1 WATER_SIM_FRAMERATE:60 MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:2 END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 RIPPLE_PUDDLES RIPPLE_WATER Puddles ShaderSnow:1 CUMULONIMBUS:0 CloudLayer0 CloudLayer1 CloudLayer2 CloudLayer3 VL_RENDER_RESOLUTION:1.0 indirect_effect:3 RAY_COUNT:4 SAMPLES:8 REALMOON shadowMapResolution:3172 shadowDistance:144.0 DH_SCREENSPACE_REFLECTIONS LPV_ENABLED SAND_STORMS SNOW_STORMS !TAA_UPSCALING SCALE_FACTOR:0.75 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION -profile.ULTRA = WATER_INTERACTION:2 WATER_SIM_DISTANCE:3 WATER_SIM_SCALE:2 WATER_SIM_FRAMERATE:60 MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:2 END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 RIPPLE_PUDDLES RIPPLE_WATER Puddles ShaderSnow:1 CUMULONIMBUS:1 CloudLayer0 CloudLayer1 CloudLayer2 CloudLayer3 VL_RENDER_RESOLUTION:1.0 indirect_effect:4 RAY_COUNT:6 SAMPLES:10 REALMOON shadowMapResolution:4096 shadowDistance:144.0 DH_SCREENSPACE_REFLECTIONS LPV_ENABLED SAND_STORMS SNOW_STORMS !TAA_UPSCALING SCALE_FACTOR:0.75 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION +profile.POTATO = WATER_INTERACTION:0 WATER_SIM_DISTANCE:1 WATER_SIM_SCALE:0 WATER_SIM_FRAMERATE:30 !MOON_NORMALS RAINBOW:0 !CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:0 !END_ISLAND_LIGHT CloudLayer0_distance:10000.0 CloudLayer1_distance:10000.0 !RIPPLE_PUDDLES !RIPPLE_WATER PUDDLE_MODE:0 ShaderSnow:0 CUMULONIMBUS:0 CloudLayer0 !CloudLayer1 !CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.25 indirect_effect:0 RAY_COUNT:4 VL_SAMPLES:4 !REALMOON shadowMapResolution:512 shadowDistance:64.0 !DH_SCREENSPACE_REFLECTIONS !LPV_ENABLED !SAND_STORMS !SNOW_STORMS TAA_UPSCALING SCALE_FACTOR:0.7 SHARPENING:0.55 !FORWARD_ENVIORNMENT_REFLECTION +profile.VERY_LOW = WATER_INTERACTION:1 WATER_SIM_DISTANCE:1 WATER_SIM_SCALE:0 WATER_SIM_FRAMERATE:30 !MOON_NORMALS RAINBOW:0 !CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:0 !END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 !RIPPLE_PUDDLES !RIPPLE_WATER PUDDLE_MODE:0 ShaderSnow:0 CUMULONIMBUS:0 CloudLayer0 !CloudLayer1 !CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.25 indirect_effect:0 RAY_COUNT:4 VL_SAMPLES:4 REALMOON shadowMapResolution:1024 shadowDistance:96.0 !DH_SCREENSPACE_REFLECTIONS !LPV_ENABLED !SAND_STORMS !SNOW_STORMS TAA_UPSCALING SCALE_FACTOR:0.8 SHARPENING:0.5 !FORWARD_ENVIORNMENT_REFLECTION +profile.LOW = WATER_INTERACTION:2 WATER_SIM_DISTANCE:2 WATER_SIM_SCALE:0 WATER_SIM_FRAMERATE:30 !MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:0 !END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 !RIPPLE_PUDDLES !RIPPLE_WATER PUDDLE_MODE:0 ShaderSnow:0 CUMULONIMBUS:0 CloudLayer0 !CloudLayer1 CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.25 indirect_effect:1 RAY_COUNT:4 VL_SAMPLES:6 REALMOON shadowMapResolution:1536 shadowDistance:112.0 !DH_SCREENSPACE_REFLECTIONS !LPV_ENABLED SAND_STORMS SNOW_STORMS TAA_UPSCALING SCALE_FACTOR:0.9 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION +profile.MEDIUM = WATER_INTERACTION:2 WATER_SIM_DISTANCE:2 WATER_SIM_SCALE:1 WATER_SIM_FRAMERATE:30 MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:1 END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 !RIPPLE_PUDDLES RIPPLE_WATER PUDDLE_MODE:0 ShaderSnow:0 CUMULONIMBUS:0 CloudLayer0 CloudLayer1 CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.5 indirect_effect:1 RAY_COUNT:4 SAMPLES:6 REALMOON shadowMapResolution:2048 shadowDistance:128.0 DH_SCREENSPACE_REFLECTIONS !LPV_ENABLED SAND_STORMS SNOW_STORMS !TAA_UPSCALING SCALE_FACTOR:0.75 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION +profile.HIGH = WATER_INTERACTION:2 WATER_SIM_DISTANCE:2 WATER_SIM_SCALE:1 WATER_SIM_FRAMERATE:60 MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:1 END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 RIPPLE_PUDDLES RIPPLE_WATER PUDDLE_MODE:1 ShaderSnow:1 CUMULONIMBUS:0 CloudLayer0 CloudLayer1 CloudLayer2 !CloudLayer3 VL_RENDER_RESOLUTION:0.5 indirect_effect:1 RAY_COUNT:4 SAMPLES:8 REALMOON shadowMapResolution:2560 shadowDistance:128.0 DH_SCREENSPACE_REFLECTIONS LPV_ENABLED SAND_STORMS SNOW_STORMS !TAA_UPSCALING SCALE_FACTOR:0.75 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION +profile.VERY_HIGH = WATER_INTERACTION:2 WATER_SIM_DISTANCE:3 WATER_SIM_SCALE:1 WATER_SIM_FRAMERATE:60 MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:2 END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 RIPPLE_PUDDLES RIPPLE_WATER PUDDLE_MODE:1 ShaderSnow:1 CUMULONIMBUS:0 CloudLayer0 CloudLayer1 CloudLayer2 CloudLayer3 VL_RENDER_RESOLUTION:1.0 indirect_effect:3 RAY_COUNT:4 SAMPLES:8 REALMOON shadowMapResolution:3172 shadowDistance:144.0 DH_SCREENSPACE_REFLECTIONS LPV_ENABLED SAND_STORMS SNOW_STORMS !TAA_UPSCALING SCALE_FACTOR:0.75 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION +profile.ULTRA = WATER_INTERACTION:2 WATER_SIM_DISTANCE:3 WATER_SIM_SCALE:2 WATER_SIM_FRAMERATE:60 MOON_NORMALS RAINBOW:1 CUSTOM_MOON_ROTATION CUSTOM_SHADOWS_QUALITY:2 END_ISLAND_LIGHT CloudLayer0_distance:100000.0 CloudLayer1_distance:100000.0 RIPPLE_PUDDLES RIPPLE_WATER PUDDLE_MODE:1 ShaderSnow:1 CUMULONIMBUS:1 CloudLayer0 CloudLayer1 CloudLayer2 CloudLayer3 VL_RENDER_RESOLUTION:1.0 indirect_effect:4 RAY_COUNT:6 SAMPLES:10 REALMOON shadowMapResolution:4096 shadowDistance:144.0 DH_SCREENSPACE_REFLECTIONS LPV_ENABLED SAND_STORMS SNOW_STORMS !TAA_UPSCALING SCALE_FACTOR:0.75 SHARPENING:0.45 FORWARD_ENVIORNMENT_REFLECTION clouds=off @@ -45,7 +45,7 @@ iris.features.optional = ENTITY_TRANSLUCENT REVERSED_CULLING COMPUTE_SHADERS CUS customTexture.snowTexN = texture/snowN.png #endif -#if ShaderSnow > 0 || defined Puddles +#if ShaderSnow > 0 || PUDDLE_MODE > 0 customTexture.snowTexR = texture/snowR.png #endif @@ -186,7 +186,7 @@ alphaTest.gbuffers_water = false alphaTest.gbuffers_skybasic = false alphaTest.gbuffers_skytextured = false -sliders = WATER_SIM_STRENGTH WATER_SIM_FRAMERATE WATER_SIM_SCALE WATER_SIM_DISTANCE dayStartTick nightStartTick daySpeed nightSpeed FAKE_REFRACTION_AMOUNT FAKE_DISPERSION_AMOUNT REFRACTION_SMUDGE_AMOUNT NORMAL_MAP_MULT DEFERRED_SSR_QUALITY FORWARD_SSR_QUALITY RAINBOW_TIME RAINBOW RAINBOW_DISTANCE RAINBOW_BRIGHTNESS VORTEX_LIGHT_COL_R VORTEX_LIGHT_COL_G VORTEX_LIGHT_COL_B END_LIGHTNING_COL_R END_LIGHTNING_COL_G END_LIGHTNING_COL_B END_HAZE_DENSTIY NETHER_CEILING_SMOKE_DENSITY NETHER_HAZE_DENSITY Max_Filter_Depth_END Min_Shadow_Filter_Radius_END MOON_TIME_OFFSET EARTH_ROTATION_TILT CUSTOM_SHADOWS_QUALITY MOON_LATITUDE MOON_SIZE_SETTING MONTH_LENGTH LIGHTNING_SHADOWS WHITE_BALANCE STARS_BRIGHTNESS STARS_AMOUNT AmbientLightEnd_R AmbientLightEnd_G AmbientLightEnd_B CloudLayer0_distance CloudLayer1_distance CloudLayer2_distance CloudLayer3_distance BLEND_FACTOR_DURING_MOVEMENT CloudLayer0_detail CloudLayer1_detail LPV_VL_FOG_ILLUMINATION MIN_LIGHT_AMOUNT_INSIDE CUMULONIMBUS_FADE_TIME CUMULONIMBUS NOISE_RESOLUTION NOISE_INTENSITY NOISE_DROPOFF WAVE_DETAIL DH_CHUNK_FADING CLOUD_MOVEMENT_TYPE LIGHTLEAKFIX_MODE EMISSIVE_ORES_STRENGTH RIPPLE_STRENGTH RIPPLE_INTENSITY CUSTOM_LIGHTNING_SCALE CUSTOM_LIGHTNING_R CUSTOM_LIGHTNING_G CUSTOM_LIGHTNING_B CUSTOM_LIGHTNING_TEX CUSTOM_LIGHTNING_POS_X CUSTOM_LIGHTNING_POS_Y CUSTOM_LIGHTNING_POS_Z CUMULONIMBUS_LIGHTNING_BRIGHTNESS CUMULONIMBUS_LIGHTNING_DELAY ShaderSnow ShaderSnowStrength BorderFogIntensity CAVE_DETECTION ON_FIRE_DISTORT_EFFECT_STRENGTH USE_CUSTOM_SKY_GROUND_LIGHTING_COLORS DIRECTLIGHT_DIFFUSE_R DIRECTLIGHT_DIFFUSE_G DIRECTLIGHT_DIFFUSE_B INDIRECTLIGHT_DIFFUSE_R INDIRECTLIGHT_DIFFUSE_G INDIRECTLIGHT_DIFFUSE_B DIRECTLIGHT_CLOUDS_R DIRECTLIGHT_CLOUDS_G DIRECTLIGHT_CLOUDS_B INDIRECTLIGHT_CLOUDS_R INDIRECTLIGHT_CLOUDS_G INDIRECTLIGHT_CLOUDS_B DIRECTLIGHT_FOG_R DIRECTLIGHT_FOG_G DIRECTLIGHT_FOG_B INDIRECTLIGHT_FOG_R INDIRECTLIGHT_FOG_G INDIRECTLIGHT_FOG_B SKY_GROUND_R SKY_GROUND_G SKY_GROUND_B DOF_DISPERSION_MULT FLASHLIGHT_BRIGHTNESS_MULT FLASHLIGHT_BRIGHTNESS_FALLOFF_MULT FLASHLIGHT_RANGE FLASHLIGHT_SIZE FLASHLIGHT_R FLASHLIGHT_G FLASHLIGHT_B LOW_HEALTH_EFFECT_START CRITICALLY_LOW_HEALTH_EFFECT_START CloudLayer2_scale CloudLayer0_scale CloudLayer1_scale CloudLayer3_scale CloudLayer0_tallness CloudLayer1_tallness EXPOSURE_DARKENING EXPOSURE_BRIGHTENING VIGNETTE_STRENGTH CURVATURE_AMOUNT MINIMUM_WATER_ABSORBANCE CHROMATIC_ABERRATION_STRENGTH SELECT_BOX_COL_R SELECT_BOX_COL_G SELECT_BOX_COL_B LPV_VL_FOG_ILLUMINATION_BRIGHTNESS minRayMarchSteps MOTION_BLUR_STRENGTH OVERDRAW_MAX_DISTANCE DAY0_l3_coverage DAY0_l3_density DAY1_l3_coverage DAY1_l3_density DAY2_l3_coverage DAY2_l3_density DAY3_l3_coverage DAY3_l3_density DAY4_l3_coverage DAY4_l3_density DAY5_l3_coverage DAY5_l3_density DAY6_l3_coverage DAY6_l3_density DAY7_l3_coverage DAY7_l3_density DAY8_l3_coverage DAY8_l3_density DAY9_l3_coverage DAY9_l3_density DAY0_l0_coverage DAY0_l1_coverage DAY0_l2_coverage DAY0_ufog_density DAY0_l0_density DAY0_l1_density DAY0_l2_density DAY0_cfog_density DAY1_l0_coverage DAY1_l1_coverage DAY1_l2_coverage DAY1_ufog_density DAY1_l0_density DAY1_l1_density DAY1_l2_density DAY1_cfog_density DAY2_l0_coverage DAY2_l1_coverage DAY2_l2_coverage DAY2_ufog_density DAY2_l0_density DAY2_l1_density DAY2_l2_density DAY2_cfog_density DAY3_l0_coverage DAY3_l1_coverage DAY3_l2_coverage DAY3_ufog_density DAY3_l0_density DAY3_l1_density DAY3_l2_density DAY3_cfog_density DAY4_l0_coverage DAY4_l1_coverage DAY4_l2_coverage DAY4_ufog_density DAY4_l0_density DAY4_l1_density DAY4_l2_density DAY4_cfog_density DAY5_l0_coverage DAY5_l1_coverage DAY5_l2_coverage DAY5_ufog_density DAY5_l0_density DAY5_l1_density DAY5_l2_density DAY5_cfog_density DAY6_l0_coverage DAY6_l1_coverage DAY6_l2_coverage DAY6_ufog_density DAY6_l0_density DAY6_l1_density DAY6_l2_density DAY6_cfog_density DAY7_l0_coverage DAY7_l1_coverage DAY7_l2_coverage DAY7_ufog_density DAY7_l0_density DAY7_l1_density DAY7_l2_density DAY7_cfog_density DAY8_l0_coverage DAY8_l1_coverage DAY8_l2_coverage DAY8_ufog_density DAY8_l0_density DAY8_l1_density DAY8_l2_density DAY8_cfog_density DAY9_l0_coverage DAY9_l1_coverage DAY9_l2_coverage DAY9_ufog_density DAY9_l0_density DAY9_l1_density DAY9_l2_density DAY9_cfog_density sss_density_multiplier sss_absorbance_multiplier MOTION_AMOUNT TONEMAP WATER_WAVE_SPEED WATER_CAUSTICS_BRIGHTNESS WATER_CAUSTICS_POWER DEBUG_VIEW entityShadowDistanceMul HANDHELD_LIGHT_RANGE CLOUD_SHADOW_STRENGTH CloudLayer0_coverage CloudLayer0_density CloudLayer0_height CloudLayer1_coverage CloudLayer1_density CloudLayer1_height CloudLayer2_coverage CloudLayer2_density CloudLayer2_height CloudLayer3_coverage CloudLayer3_density CloudLayer3_height PLANET_GROUND_BRIGHTNESS FOG_START_HEIGHT WATER_WAVE_STRENGTH SWAMP_UNIFORM_DENSITY SWAMP_CLOUDY_DENSITY SWAMP_R SWAMP_G SWAMP_B JUNGLE_UNIFORM_DENSITY JUNGLE_CLOUDY_DENSITY JUNGLE_R JUNGLE_G JUNGLE_B DARKFOREST_UNIFORM_DENSITY DARKFOREST_CLOUDY_DENSITY DARKFOREST_R DARKFOREST_G DARKFOREST_B NETHER_PLUME_DENSITY END_STORM_DENSTIY LIT_PARTICLE_BRIGHTNESS UPPER_CURVE LOWER_CURVE EMISSIVE_TYPE SCALE_FACTOR ambientsss_brightness SSS_TYPE Cloud_Speed Cloud_Speed_Rain Cloud_Speed_Thunder ORB_ColMult ORB_X ORB_Y ORB_Z ORB_R ORB_G ORB_B TOD_Fog_mult Morning_Uniform_Fog Noon_Uniform_Fog Evening_Uniform_Fog Night_Uniform_Fog Morning_Cloudy_Fog Noon_Cloudy_Fog Evening_Cloudy_Fog Night_Cloudy_Fog Summer_Leaf_R Summer_Leaf_G Summer_Leaf_B Fall_Leaf_R Fall_Leaf_G Fall_Leaf_B Winter_Leaf_R Winter_Leaf_G Winter_Leaf_B Spring_Leaf_R Spring_Leaf_G Spring_Leaf_B Summer_R Summer_G Summer_B Fall_R Fall_G Fall_B Winter_R Winter_G Winter_B Spring_R Spring_G Spring_B Season_Length CaveFogFallOff CaveFogColor_R CaveFogColor_G CaveFogColor_B indirect_effect GI_Strength ambient_brightness AmbientLightRain_R AmbientLightRain_G AmbientLightRain_B AmbientLight_R AmbientLight_G AmbientLight_B Rain_coverage Thunder_coverage Moon_temp Haze_amount RainFog_amount Sun_temp Puddle_Size Puddle_Reflection_Sharpness LabSSS_Curve Emissive_Curve Emissive_Brightness AO_Strength BLOOMY_FOG WAVY_SPEED WAVY_STRENGTH BLOOM_STRENGTH shadowDistance Sky_Brightness fog_coefficientMieR fog_coefficientMieG fog_coefficientMieB sun_illuminance sunColorG sunColorB sunColorR sky_mieg sky_coefficientMieB sky_coefficientMieG sky_coefficientMieR sky_coefficientRayleighB sky_coefficientRayleighG sky_coefficientRayleighR CLOUDS_QUALITY EXPOSURE_MULTIPLIER MIN_LIGHT_AMOUNT TORCH_R TORCH_G TORCH_B TORCH_AMOUNT shadowMapResolution sunPathRotation BLEND_FACTOR VL_SAMPLES Exposure_Speed POM_DEPTH MAX_ITERATIONS MAX_DIST ambientOcclusionLevel SEA_LEVEL moon_illuminance moonColorR moonColorG moonColorB fog_coefficientRayleighR fog_coefficientRayleighG SATURATION Manual_exposure_value focal fstop MANUAL_FOCUS SHADOW_FILTER_SAMPLE_COUNT Max_Filter_Depth VPS_Search_Samples Min_Shadow_Filter_Radius Max_Shadow_Filter_Radius Water_Top_Layer fog_coefficientRayleighB SHARPENING rayMarchSampleCount Dirt_Amount Dirt_Scatter_R Dirt_Scatter_G Dirt_Scatter_B Dirt_Absorb_R Dirt_Absorb_G Dirt_Absorb_B Water_Absorb_R Water_Absorb_G Water_Absorb_B Purkinje_strength Purkinje_strength Purkinje_R Purkinje_G Purkinje_B Texture_MipMap_Bias DoF_Adaptation_Speed Purkinje_Multiplier CROSSTALK VL_RENDER_RESOLUTION BLOOM_QUALITY VL_RENDER_RESOLUTION RAY_COUNT STEPS STEP_LENGTH cloud_LevelOfDetail cloud_ShadowLevelOfDetail cloud_LevelOfDetailLQ cloud_ShadowLevelOfDetailLQ minRayMarchSteps maxRayMarchSteps minRayMarchStepsLQ maxRayMarchStepsLQ fbmAmount fbmPower1 fbmPower2 ROUGHNESS_THRESHOLD SUN_SPECULAR_MULT reflection_quality DOF_QUALITY DOF_ANAMORPHIC_RATIO AEROCHROME_PINKNESS DOF_JITTER_FOCUS JITTER_STRENGTH SHADOWS_GRADE_R MIDS_GRADE_R HIGHLIGHTS_GRADE_R SHADOWS_GRADE_G MIDS_GRADE_G HIGHLIGHTS_GRADE_G SHADOWS_GRADE_B MIDS_GRADE_B HIGHLIGHTS_GRADE_B SHADOWS_GRADE_MUL MIDS_GRADE_MUL HIGHLIGHTS_GRADE_MUL LPV_SATURATION LPV_TINT_SATURATION LPV_NORMAL_STRENGTH +sliders = PUDDLE_MODE FLASHLIGHT_SHADOWS_STRENGTH LPV_HANDHELD_SHADOWS_STRENGTH AURORA_R AURORA_G AURORA_B AURORA_LOCATION AURORA_MOON AURORA_BRIGHTNESS AURORA_CHANCE WATER_SIM_STRENGTH WATER_SIM_FRAMERATE WATER_SIM_SCALE WATER_SIM_DISTANCE dayStartTick nightStartTick daySpeed nightSpeed FAKE_REFRACTION_AMOUNT FAKE_DISPERSION_AMOUNT REFRACTION_SMUDGE_AMOUNT NORMAL_MAP_MULT DEFERRED_SSR_QUALITY FORWARD_SSR_QUALITY RAINBOW_TIME RAINBOW RAINBOW_DISTANCE RAINBOW_BRIGHTNESS VORTEX_LIGHT_COL_R VORTEX_LIGHT_COL_G VORTEX_LIGHT_COL_B END_LIGHTNING_COL_R END_LIGHTNING_COL_G END_LIGHTNING_COL_B END_HAZE_DENSTIY NETHER_CEILING_SMOKE_DENSITY NETHER_HAZE_DENSITY Max_Filter_Depth_END Min_Shadow_Filter_Radius_END MOON_TIME_OFFSET EARTH_ROTATION_TILT CUSTOM_SHADOWS_QUALITY MOON_LATITUDE MOON_SIZE_SETTING MONTH_LENGTH LIGHTNING_SHADOWS WHITE_BALANCE STARS_BRIGHTNESS STARS_AMOUNT AmbientLightEnd_R AmbientLightEnd_G AmbientLightEnd_B CloudLayer0_distance CloudLayer1_distance CloudLayer2_distance CloudLayer3_distance BLEND_FACTOR_DURING_MOVEMENT CloudLayer0_detail CloudLayer1_detail LPV_VL_FOG_ILLUMINATION MIN_LIGHT_AMOUNT_INSIDE CUMULONIMBUS_FADE_TIME CUMULONIMBUS NOISE_RESOLUTION NOISE_INTENSITY NOISE_DROPOFF WAVE_DETAIL DH_CHUNK_FADING CLOUD_MOVEMENT_TYPE LIGHTLEAKFIX_MODE EMISSIVE_ORES_STRENGTH RIPPLE_STRENGTH RIPPLE_INTENSITY CUSTOM_LIGHTNING_SCALE CUSTOM_LIGHTNING_R CUSTOM_LIGHTNING_G CUSTOM_LIGHTNING_B CUSTOM_LIGHTNING_TEX CUSTOM_LIGHTNING_POS_X CUSTOM_LIGHTNING_POS_Y CUSTOM_LIGHTNING_POS_Z CUMULONIMBUS_LIGHTNING_BRIGHTNESS CUMULONIMBUS_LIGHTNING_DELAY ShaderSnow ShaderSnowStrength BorderFogIntensity CAVE_DETECTION ON_FIRE_DISTORT_EFFECT_STRENGTH USE_CUSTOM_SKY_GROUND_LIGHTING_COLORS DIRECTLIGHT_DIFFUSE_R DIRECTLIGHT_DIFFUSE_G DIRECTLIGHT_DIFFUSE_B INDIRECTLIGHT_DIFFUSE_R INDIRECTLIGHT_DIFFUSE_G INDIRECTLIGHT_DIFFUSE_B DIRECTLIGHT_CLOUDS_R DIRECTLIGHT_CLOUDS_G DIRECTLIGHT_CLOUDS_B INDIRECTLIGHT_CLOUDS_R INDIRECTLIGHT_CLOUDS_G INDIRECTLIGHT_CLOUDS_B DIRECTLIGHT_FOG_R DIRECTLIGHT_FOG_G DIRECTLIGHT_FOG_B INDIRECTLIGHT_FOG_R INDIRECTLIGHT_FOG_G INDIRECTLIGHT_FOG_B SKY_GROUND_R SKY_GROUND_G SKY_GROUND_B DOF_DISPERSION_MULT FLASHLIGHT_BRIGHTNESS_MULT FLASHLIGHT_BRIGHTNESS_FALLOFF_MULT FLASHLIGHT_RANGE FLASHLIGHT_SIZE FLASHLIGHT_R FLASHLIGHT_G FLASHLIGHT_B LOW_HEALTH_EFFECT_START CRITICALLY_LOW_HEALTH_EFFECT_START CloudLayer2_scale CloudLayer0_scale CloudLayer1_scale CloudLayer3_scale CloudLayer0_tallness CloudLayer1_tallness EXPOSURE_DARKENING EXPOSURE_BRIGHTENING VIGNETTE_STRENGTH CURVATURE_AMOUNT MINIMUM_WATER_ABSORBANCE CHROMATIC_ABERRATION_STRENGTH SELECT_BOX_COL_R SELECT_BOX_COL_G SELECT_BOX_COL_B LPV_VL_FOG_ILLUMINATION_BRIGHTNESS minRayMarchSteps MOTION_BLUR_STRENGTH OVERDRAW_MAX_DISTANCE DAY0_l3_coverage DAY0_l3_density DAY1_l3_coverage DAY1_l3_density DAY2_l3_coverage DAY2_l3_density DAY3_l3_coverage DAY3_l3_density DAY4_l3_coverage DAY4_l3_density DAY5_l3_coverage DAY5_l3_density DAY6_l3_coverage DAY6_l3_density DAY7_l3_coverage DAY7_l3_density DAY8_l3_coverage DAY8_l3_density DAY9_l3_coverage DAY9_l3_density DAY0_l0_coverage DAY0_l1_coverage DAY0_l2_coverage DAY0_ufog_density DAY0_l0_density DAY0_l1_density DAY0_l2_density DAY0_cfog_density DAY1_l0_coverage DAY1_l1_coverage DAY1_l2_coverage DAY1_ufog_density DAY1_l0_density DAY1_l1_density DAY1_l2_density DAY1_cfog_density DAY2_l0_coverage DAY2_l1_coverage DAY2_l2_coverage DAY2_ufog_density DAY2_l0_density DAY2_l1_density DAY2_l2_density DAY2_cfog_density DAY3_l0_coverage DAY3_l1_coverage DAY3_l2_coverage DAY3_ufog_density DAY3_l0_density DAY3_l1_density DAY3_l2_density DAY3_cfog_density DAY4_l0_coverage DAY4_l1_coverage DAY4_l2_coverage DAY4_ufog_density DAY4_l0_density DAY4_l1_density DAY4_l2_density DAY4_cfog_density DAY5_l0_coverage DAY5_l1_coverage DAY5_l2_coverage DAY5_ufog_density DAY5_l0_density DAY5_l1_density DAY5_l2_density DAY5_cfog_density DAY6_l0_coverage DAY6_l1_coverage DAY6_l2_coverage DAY6_ufog_density DAY6_l0_density DAY6_l1_density DAY6_l2_density DAY6_cfog_density DAY7_l0_coverage DAY7_l1_coverage DAY7_l2_coverage DAY7_ufog_density DAY7_l0_density DAY7_l1_density DAY7_l2_density DAY7_cfog_density DAY8_l0_coverage DAY8_l1_coverage DAY8_l2_coverage DAY8_ufog_density DAY8_l0_density DAY8_l1_density DAY8_l2_density DAY8_cfog_density DAY9_l0_coverage DAY9_l1_coverage DAY9_l2_coverage DAY9_ufog_density DAY9_l0_density DAY9_l1_density DAY9_l2_density DAY9_cfog_density sss_density_multiplier sss_absorbance_multiplier MOTION_AMOUNT TONEMAP WATER_WAVE_SPEED WATER_CAUSTICS_BRIGHTNESS WATER_CAUSTICS_POWER DEBUG_VIEW entityShadowDistanceMul HANDHELD_LIGHT_RANGE CLOUD_SHADOW_STRENGTH CloudLayer0_coverage CloudLayer0_density CloudLayer0_height CloudLayer1_coverage CloudLayer1_density CloudLayer1_height CloudLayer2_coverage CloudLayer2_density CloudLayer2_height CloudLayer3_coverage CloudLayer3_density CloudLayer3_height PLANET_GROUND_BRIGHTNESS FOG_START_HEIGHT WATER_WAVE_STRENGTH SWAMP_UNIFORM_DENSITY SWAMP_CLOUDY_DENSITY SWAMP_R SWAMP_G SWAMP_B JUNGLE_UNIFORM_DENSITY JUNGLE_CLOUDY_DENSITY JUNGLE_R JUNGLE_G JUNGLE_B DARKFOREST_UNIFORM_DENSITY DARKFOREST_CLOUDY_DENSITY DARKFOREST_R DARKFOREST_G DARKFOREST_B NETHER_PLUME_DENSITY END_STORM_DENSTIY LIT_PARTICLE_BRIGHTNESS UPPER_CURVE LOWER_CURVE EMISSIVE_TYPE SCALE_FACTOR ambientsss_brightness SSS_TYPE Cloud_Speed Cloud_Speed_Rain Cloud_Speed_Thunder ORB_ColMult ORB_X ORB_Y ORB_Z ORB_R ORB_G ORB_B TOD_Fog_mult Morning_Uniform_Fog Noon_Uniform_Fog Evening_Uniform_Fog Night_Uniform_Fog Morning_Cloudy_Fog Noon_Cloudy_Fog Evening_Cloudy_Fog Night_Cloudy_Fog Summer_Leaf_R Summer_Leaf_G Summer_Leaf_B Fall_Leaf_R Fall_Leaf_G Fall_Leaf_B Winter_Leaf_R Winter_Leaf_G Winter_Leaf_B Spring_Leaf_R Spring_Leaf_G Spring_Leaf_B Summer_R Summer_G Summer_B Fall_R Fall_G Fall_B Winter_R Winter_G Winter_B Spring_R Spring_G Spring_B Season_Length CaveFogFallOff CaveFogColor_R CaveFogColor_G CaveFogColor_B indirect_effect GI_Strength ambient_brightness AmbientLightRain_R AmbientLightRain_G AmbientLightRain_B AmbientLight_R AmbientLight_G AmbientLight_B Rain_coverage Thunder_coverage Moon_temp Haze_amount RainFog_amount Sun_temp Puddle_Size Puddle_Reflection_Sharpness LabSSS_Curve Emissive_Curve Emissive_Brightness AO_Strength BLOOMY_FOG WAVY_SPEED WAVY_STRENGTH BLOOM_STRENGTH shadowDistance Sky_Brightness fog_coefficientMieR fog_coefficientMieG fog_coefficientMieB sun_illuminance sunColorG sunColorB sunColorR sky_mieg sky_coefficientMieB sky_coefficientMieG sky_coefficientMieR sky_coefficientRayleighB sky_coefficientRayleighG sky_coefficientRayleighR CLOUDS_QUALITY EXPOSURE_MULTIPLIER MIN_LIGHT_AMOUNT TORCH_R TORCH_G TORCH_B TORCH_AMOUNT shadowMapResolution sunPathRotation BLEND_FACTOR VL_SAMPLES Exposure_Speed POM_DEPTH MAX_ITERATIONS MAX_DIST ambientOcclusionLevel SEA_LEVEL moon_illuminance moonColorR moonColorG moonColorB fog_coefficientRayleighR fog_coefficientRayleighG SATURATION Manual_exposure_value focal fstop MANUAL_FOCUS SHADOW_FILTER_SAMPLE_COUNT Max_Filter_Depth VPS_Search_Samples Min_Shadow_Filter_Radius Max_Shadow_Filter_Radius Water_Top_Layer fog_coefficientRayleighB SHARPENING rayMarchSampleCount Dirt_Amount Dirt_Scatter_R Dirt_Scatter_G Dirt_Scatter_B Dirt_Absorb_R Dirt_Absorb_G Dirt_Absorb_B Water_Absorb_R Water_Absorb_G Water_Absorb_B Purkinje_strength Purkinje_strength Purkinje_R Purkinje_G Purkinje_B Texture_MipMap_Bias DoF_Adaptation_Speed Purkinje_Multiplier CROSSTALK VL_RENDER_RESOLUTION BLOOM_QUALITY VL_RENDER_RESOLUTION RAY_COUNT STEPS STEP_LENGTH cloud_LevelOfDetail cloud_ShadowLevelOfDetail cloud_LevelOfDetailLQ cloud_ShadowLevelOfDetailLQ minRayMarchSteps maxRayMarchSteps minRayMarchStepsLQ maxRayMarchStepsLQ fbmAmount fbmPower1 fbmPower2 ROUGHNESS_THRESHOLD SUN_SPECULAR_MULT reflection_quality DOF_QUALITY DOF_ANAMORPHIC_RATIO AEROCHROME_PINKNESS DOF_JITTER_FOCUS JITTER_STRENGTH SHADOWS_GRADE_R MIDS_GRADE_R HIGHLIGHTS_GRADE_R SHADOWS_GRADE_G MIDS_GRADE_G HIGHLIGHTS_GRADE_G SHADOWS_GRADE_B MIDS_GRADE_B HIGHLIGHTS_GRADE_B SHADOWS_GRADE_MUL MIDS_GRADE_MUL HIGHLIGHTS_GRADE_MUL LPV_SATURATION LPV_TINT_SATURATION LPV_NORMAL_STRENGTH screen.columns=2 screen = \ @@ -257,7 +257,7 @@ SHADER_VERSION_LABEL \ screen.Resource_Pack_Support.columns = 1 screen.Resource_Pack_Support = [SPECULAR] [Emissives] [Subsurface_Scattering] [POM] [Refraction] MATERIAL_AO \ LPV_TINT_SATURATION LPV_REDSTONE_LIGHTS \ LPV_NORMAL_STRENGTH LPV_ENTITY_LIGHTS \ LPV_NOSHADOW_HACK \ - LPV_VL_FOG_ILLUMINATION LPV_VL_FOG_ILLUMINATION_BRIGHTNESS VANILLA_LIGHTMAP_MASK + LPV_VL_FOG_ILLUMINATION LPV_VL_FOG_ILLUMINATION_BRIGHTNESS \ + VANILLA_LIGHTMAP_MASK \ + LPV_HANDHELD_SHADOWS LPV_HANDHELD_SHADOWS_STRENGTH ######## WORLD screen.World.columns=1 - screen.World = [Water] [Waving_Stuff] [World_Effects] PLANET_CURVATURE CURVATURE_AMOUNT [Sky_coefficients] SKY_GROUND STARS_AMOUNT STARS_BRIGHTNESS EMISSIVE_ORES EMISSIVE_ORES_STRENGTH - ### WAVING STUFF - screen.Waving_Stuff.columns=1 - screen.Waving_Stuff = WAVY_PLANTS WAVY_STRENGTH WAVY_SPEED + screen.World = [Water] [Waving_Stuff] [World_Effects] [AURORA_SETTINGS] PLANET_CURVATURE CURVATURE_AMOUNT [Sky_coefficients] SKY_GROUND STARS_AMOUNT STARS_BRIGHTNESS EMISSIVE_ORES EMISSIVE_ORES_STRENGTH + + ### WAVING STUFF + screen.Waving_Stuff.columns=1 + screen.Waving_Stuff = WAVY_PLANTS WAVY_STRENGTH WAVY_SPEED - screen.World_Effects.columns=1 - screen.World_Effects = [Rainbow_Settings] Puddles Puddle_Size Puddle_Reflection_Sharpness ShaderSnow ShaderSnowStrength RIPPLE_WATER RIPPLE_PUDDLES RIPPLE_INTENSITY RIPPLE_STRENGTH + screen.AURORA_SETTINGS.columns=1 + screen.AURORA_SETTINGS = AURORA_LOCATION AURORA_MOON AURORA_BRIGHTNESS AURORA_CHANCE AURORA_R AURORA_G AURORA_B + screen.World_Effects.columns=1 + screen.World_Effects = [Rainbow_Settings] PUDDLE_MODE Puddle_Size Puddle_Reflection_Sharpness ShaderSnow ShaderSnowStrength RIPPLE_WATER RIPPLE_PUDDLES RIPPLE_INTENSITY RIPPLE_STRENGTH - screen.Rainbow_Settings.columns=1 - screen.Rainbow_Settings = RAINBOW RAINBOW_BRIGHTNESS RAINBOW_DISTANCE RAINBOW_TIME RAINBOW_ONLY_BELOW_CLOUDS + screen.Rainbow_Settings.columns=1 + screen.Rainbow_Settings = RAINBOW RAINBOW_BRIGHTNESS RAINBOW_DISTANCE RAINBOW_TIME RAINBOW_ONLY_BELOW_CLOUDS ######## CLIMATE screen.Climate.columns=1 screen.Climate = [Seasons] PER_BIOME_ENVIRONMENT [SWAMP] [JUNGLE] [DARKFOREST] SNOW_STORMS SAND_STORMS @@ -456,7 +461,8 @@ SHADER_VERSION_LABEL \ FLASHLIGHT_BOUNCED_INDIRECT FLASHLIGHT_B \ FLASHLIGHT_FOG_ILLUMINATION \ FLASHLIGHT_RANGE FLASHLIGHT_BRIGHTNESS_MULT \ - FLASHLIGHT_SIZE FLASHLIGHT_BRIGHTNESS_FALLOFF_MULT + FLASHLIGHT_SIZE FLASHLIGHT_BRIGHTNESS_FALLOFF_MULT \ + FLASHLIGHT_SHADOWS FLASHLIGHT_SHADOWS_STRENGTH @@ -675,6 +681,12 @@ uniform.float.snowAmount = 0.0 uniform.float.snowAmount = 1.0 #endif +#if AURORA_LOCATION == 1 + uniform.float.auroraAmount = smooth(if(biome_precipitation == 2, 1.0, 0.0), 100.0, 100.0) +#else + uniform.float.auroraAmount = 1.0 +#endif + #if CUMULONIMBUS == 1 variable.float.cumulonimbusFadeTime = (CUMULONIMBUS_FADE_TIME * 60.0) + 60.0 uniform.float.cumulonimbusStrength = smooth(if(thunderStrength > 0.0, 1.0, 0.0), 60.0, cumulonimbusFadeTime)