Update #50 - Bug fixes and shader improvements

This commit is contained in:
lax1dude
2025-02-22 16:52:35 -08:00
parent b0a2739fe1
commit 7e772e2502
133 changed files with 3064 additions and 2299 deletions

View File

@ -83,6 +83,7 @@ uniform sampler2D u_metalsLUT;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#define LIB_INCLUDE_PBR_LIGHTING_PREFETCH
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
uniform sampler2D u_irradianceMap;
@ -139,14 +140,14 @@ void main() {
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
shadowWorldPos4f.xyz += normalVector3f * 0.1;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z + 0.0001), 0.0);
break;
}
@ -175,7 +176,7 @@ void main() {
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
vec3 normalWrap3f = normalVector3f * (dot(-worldDirection4f.xyz, normalVector3f) < 0.0 ? -1.0 : 1.0);
vec3 normalWrap3f = normalVector3f * COMPARE_LT_C_C(dot(-worldDirection4f.xyz, normalVector3f), 0.0, -1.0, 1.0);
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalWrap3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
}
@ -194,8 +195,8 @@ void main() {
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
irradianceMapSamplePos2f.xz *= vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, -0.25));
irradianceMapSamplePos2f.xz += vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, 0.75));
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
skyLight *= lightmapCoords2f.g * u_sunColor3f_sky1f.w;
@ -210,7 +211,7 @@ void main() {
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = worldPosition4f.xyz - u_dynamicLightArray[i].u_lightPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
dlightDir3f = dlightDir3f * (dot(dlightDir3f, normalVector3f) < 0.0 ? 1.0 : -1.0);
dlightDir3f = dlightDir3f * COMPARE_LT_C_C(dot(dlightDir3f, normalVector3f), 0.0, 1.0, -1.0);
dlightDir3f = materialData3f.b == 1.0 ? normalVector3f : -dlightDir3f;
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;

View File

@ -40,5 +40,6 @@ void main() {
}
gbufferColor4f = vec4(diffuseRGBA.rgb, v_lightmap2f.r);
gbufferNormal4f = vec4(0.5, 0.5, 1.0, v_lightmap2f.g);
gbufferMaterial4f = vec4(texture(u_samplerNormalMaterial, vec2(v_texCoord2f.x, v_texCoord2f.y * u_textureYScale2f.x + u_textureYScale2f.y)).rgb, 1.0);
gbufferMaterial4f = texture(u_samplerNormalMaterial, vec2(v_texCoord2f.x, v_texCoord2f.y * u_textureYScale2f.x + u_textureYScale2f.y));
gbufferMaterial4f.a = 0.502 - gbufferMaterial4f.a * 0.502;
}

View File

@ -60,6 +60,7 @@ uniform float u_skyLightFactor1f;
#endif
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_env_map.glsl"
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
void main() {
vec3 diffuseColor3f;
@ -86,7 +87,7 @@ void main() {
#ifdef COMPILE_GLOBAL_AMBIENT_OCCLUSION
vec4 ao = textureLod(u_ssaoTexture, min(v_position2f * u_halfResolutionPixelAlignment2f, 1.0), 0.0);
ao.g = ao.b > 0.0 ? ao.g : 1.0;
ao.g = mix(COMPARE_GT_0_1(0.0, ao.b), 1.0, ao.g);
shadow = mix(shadow, shadow * ao.g, 0.9);
#endif
@ -102,8 +103,8 @@ void main() {
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
irradianceMapSamplePos2f.xz *= vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, -0.25));
irradianceMapSamplePos2f.xz += vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, 0.75));
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
@ -114,8 +115,8 @@ void main() {
vec3 specular = vec3(0.0);
#ifdef COMPILE_ENV_MAP_REFLECTIONS
float f = materialData4f.g < 0.06 ? 1.0 : 0.0;
f += materialData4f.r < 0.5 ? 1.0 : 0.0;
float f = COMPARE_LT_0_ANY(materialData4f.g, 0.06);
f += COMPARE_LT_0_ANY(materialData4f.r, 0.5);
while((materialData4f.a >= 0.5 ? f : -1.0) == 0.0) {
vec4 worldPosition4f = vec4(v_position2f, depth, 1.0) * 2.0 - 1.0;
worldPosition4f = u_inverseProjMatrix4f * worldPosition4f;
@ -137,8 +138,8 @@ void main() {
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
reflectDir.xz = reflectDir.xz * vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, -0.25));
reflectDir.xz += vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, 0.75));
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
@ -152,8 +153,8 @@ void main() {
#ifdef COMPILE_SCREEN_SPACE_REFLECTIONS
#ifndef COMPILE_ENV_MAP_REFLECTIONS
float f = materialData4f.g < 0.06 ? 1.0 : 0.0;
f += materialData4f.r < 0.5 ? 1.0 : 0.0;
float f = COMPARE_LT_0_ANY(materialData4f.g, 0.06);
f += COMPARE_LT_0_ANY(materialData4f.r, 0.5);
if(f == 0.0) {
#else
if((materialData4f.a < 0.5 ? f : -1.0) == 0.0) {

View File

@ -73,8 +73,12 @@ in vec3 v_viewdir3f;
uniform vec2 u_textureCoords01;
#endif
#else
#ifdef COMPILE_SUBSURFACE_SCATTERING
uniform vec4 u_materialConstants4f;
#else
uniform vec3 u_materialConstants3f;
#endif
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
mat3 cotangent_frame(in vec3 N, in vec3 p, in vec2 uv) {
@ -155,14 +159,21 @@ void main() {
normal = cf * vec3(normal2, sqrt(1.0 - dot(normal2, normal2)));
}
uv2.y += 0.5;
vec3 material = texture(u_samplerNormalMaterial, uv2).rgb;
vec4 material = texture(u_samplerNormalMaterial, uv2);
#else
vec3 material = u_materialConstants3f;
#ifdef COMPILE_SUBSURFACE_SCATTERING
vec4 material = u_materialConstants4f;
#else
vec4 material = vec4(u_materialConstants3f, 1.0);
#endif
#endif
material.a = 1.0 - material.a + u_useEnvMap1f;
material.a *= 0.502;
gbufferColor4f.rgb = color.rgb;
gbufferColor4f.a = lightmap.r;
gbufferNormal4f.rgb = normal * 0.5 + 0.5;
gbufferNormal4f.a = lightmap.g;
gbufferMaterial4f = vec4(material.rgb, u_useEnvMap1f);
gbufferMaterial4f = material;
}

View File

@ -24,7 +24,6 @@ layout(location = 0) out vec4 output4f;
in vec2 v_position2f;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_fogDepthTexture;
@ -34,6 +33,7 @@ uniform sampler2D u_lightShaftsTexture;
#ifdef COMPILE_FOG_ATMOSPHERE
uniform sampler2D u_environmentMap;
uniform sampler2D u_skyTexture;
uniform vec3 u_sunColorAdd3f;
#endif
@ -57,11 +57,6 @@ void main() {
}
#endif
float solidDepth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(solidDepth != fragPos4f.z) {
discard;
}
fragPos4f.xyz *= 2.0;
fragPos4f.xyz -= 1.0;
@ -85,18 +80,26 @@ void main() {
fragPos4f.xz *= 0.75;
vec3 envMapSample3f;
vec3 skyboxSample3f;
fragPos4f.xz *= vec2(-0.5, -0.25);
fragPos4f.xz += vec2(0.5, 0.25);
envMapSample3f = textureLod(u_environmentMap, fragPos4f.xz, 0.0).rgb + u_sunColorAdd3f;
skyboxSample3f = textureLod(u_skyTexture, v_position2f, 0.0).rgb;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
f2 = textureLod(u_lightShaftsTexture, v_position2f, 0.0).r;
envMapSample3f *= pow(f2, 2.25);
f = (f * 0.85 + 0.2) * f2 + f * (1.0 - f2);
f2 = textureLod(u_lightShaftsTexture, v_position2f, 0.0).r * 0.95 + 0.05;
envMapSample3f *= (f2 * 0.8 + 0.2);
skyboxSample3f *= f2 * f2 * f2;
f = min(f + 0.15, 1.0);
f2 = 0.5 + f * 0.5;
#else
f = max(f * 1.0375 - 0.0375, 0.0);
f2 = 0.3 + f * 0.7;
#endif
output4f = vec4(envMapSample3f * fogColor4f.rgb, f);
output4f = vec4(mix(envMapSample3f, skyboxSample3f, f2) * fogColor4f.rgb, f);
#else
output4f = vec4(fogColor4f.rgb, f);
#endif

View File

@ -129,8 +129,12 @@ layout(std140) uniform u_worldLightingData {
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
uniform sampler2D u_samplerNormalMaterial;
#else
#ifdef COMPILE_SUBSURFACE_SCATTERING
uniform vec4 u_materialConstants4f;
#else
uniform vec3 u_materialConstants3f;
#endif
#endif
uniform sampler2D u_metalsLUT;
@ -158,6 +162,7 @@ uniform sampler2D u_lightShaftsTexture;
#endif
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/pbr_env_map.glsl"
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
@ -167,14 +172,14 @@ vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_SAMPLES (1.0 / 8.0)
#define SMOOTH_SHADOW_RADIUS 0.000488
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z + 0.0001), 0.0);
#endif
#endif
@ -184,7 +189,7 @@ void main() {
vec4 diffuseColor4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
vec4 materialData4f;
float block1f;
// =========== RESOLVE CONSTANTS ============ //
@ -270,13 +275,17 @@ void main() {
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
vec2 uv2 = vec2(1.0, 0.5) * texCoords2f;
uv2.y += 0.5;
materialData3f = texture(u_samplerNormalMaterial, uv2).rgb;
materialData4f = texture(u_samplerNormalMaterial, uv2);
#else
materialData3f = u_materialConstants3f;
#ifdef COMPILE_SUBSURFACE_SCATTERING
materialData4f = u_materialConstants4f;
#else
materialData4f = vec4(u_materialConstants3f, 1.0);
#endif
#endif
vec3 metalN, metalK;
PREFETCH_METALS(diffuseColor4f.rgb, materialData3f.g, metalN, metalK)
PREFETCH_METALS(diffuseColor4f.rgb, materialData4f.g, metalN, metalK)
// ============ SUN LIGHTING ============== //
@ -292,7 +301,7 @@ void main() {
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
shadowWorldPos4f.xyz += normalVector3f * 0.1;
vec4 shadowTexPos4f;
vec2 tmpVec2;
@ -301,7 +310,6 @@ void main() {
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
@ -309,7 +317,7 @@ void main() {
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
shadowSample *= SMOOTH_SHADOW_SAMPLES;
#endif
break;
}
@ -339,16 +347,16 @@ void main() {
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f, materialData4f.rgb, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
}
float f;
#ifdef COMPILE_PARABOLOID_ENV_MAP
#if defined(COMPILE_PARABOLOID_ENV_MAP) && !defined(COMPILE_ENABLE_TEX_GEN)
// =========== ENVIRONMENT MAP =========== //
f = materialData3f.g < 0.06 ? 1.0 : 0.0;
f += materialData3f.r < 0.5 ? 1.0 : 0.0;
f = COMPARE_LT_0_ANY(materialData4f.g, 0.06);
f += COMPARE_LT_0_ANY(materialData4f.r, 0.5);
while(f == 0.0) {
float dst2 = dot(worldPosition4f.xyz, worldPosition4f.xyz);
if(dst2 > 25.0) {
@ -365,13 +373,13 @@ void main() {
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
reflectDir.xz = reflectDir.xz * vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, -0.25));
reflectDir.xz += vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, 0.75));
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
if(envMapSample4f.a == 1.0) {
lightColor3f += eaglercraftIBL_Specular(diffuseColor4f.rgb, envMapSample4f.rgb * envMapSample4f.a, worldDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * (1.0 - sqrt(dst2) * 0.2);
lightColor3f += eaglercraftIBL_Specular(diffuseColor4f.rgb, envMapSample4f.rgb * envMapSample4f.a, worldDirection4f.xyz, normalVector3f, materialData4f.rgb, metalN, metalK) * (1.0 - sqrt(dst2) * 0.2);
}
break;
}
@ -393,8 +401,8 @@ void main() {
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
irradianceMapSamplePos2f.xz *= vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, -0.25));
irradianceMapSamplePos2f.xz += vec2(0.5, COMPARE_GT_C_C(irradianceMapSamplePos2f.y, 0.0, 0.25, 0.75));
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
skyLight *= lightmapCoords2f.g * u_sunColor3f_sky1f.w;
@ -409,7 +417,7 @@ void main() {
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = worldPosition4f.xyz - u_dynamicLightArray[i].u_lightPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
dlightDir3f = materialData3f.b == 1.0 ? normalVector3f : -dlightDir3f;
dlightDir3f = materialData4f.b == 1.0 ? normalVector3f : -dlightDir3f;
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
@ -419,7 +427,7 @@ void main() {
continue;
}
dlightColor3f *= ((cm - 0.025) / cm);
lightColor3f += eaglercraftLighting(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.w;
lightColor3f += eaglercraftLighting(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f, materialData4f.rgb, metalN, metalK) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
@ -429,7 +437,7 @@ void main() {
vec4 fogBlend4f = vec4(0.0);
#ifndef COMPILE_ENABLE_TEX_GEN
while(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float atmos = COMPARE_LT_C_C(u_fogParameters4f.x, 4.0, 0.0, 4.0);
float type = u_fogParameters4f.x - atmos;
fogBlend4f = mix(u_fogColorLight4f, u_fogColorDark4f, lightmapCoords2f.g);
@ -454,8 +462,10 @@ void main() {
fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
fogBlend4f.a = fogBlend4f.a * 0.85 + 0.2;
fogBlend4f.rgb *= textureLod(u_lightShaftsTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r * 0.76 + 0.24;
fogBlend4f.a = min(fogBlend4f.a * 0.8 + 0.35, 1.0);
#else
fogBlend4f.a = max(fogBlend4f.a * 0.83 + 0.17, 0.0);
#endif
break;
}
@ -465,7 +475,7 @@ void main() {
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
skyLight *= u_blockSkySunDynamicLightFac4f.y;
float emissive = materialData3f.b == 1.0 ? 0.0 : materialData3f.b;
float emissive = materialData4f.b == 1.0 ? 0.0 : materialData4f.b;
diffuseColor4f.rgb *= max(skyLight + blockLight, vec3(emissive * emissive * 20.0 + 0.075)) * 0.075;
diffuseColor4f.rgb += lightColor3f;

View File

@ -85,6 +85,8 @@ layout(std140) uniform u_worldLightingData {
uniform sampler2D u_environmentMap;
uniform sampler2D u_brdfLUT;
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
#define GLASS_ROUGHNESS 0.15
#define GLASS_F0 0.4
@ -126,14 +128,14 @@ vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_SAMPLES (1.0 / 8.0)
#define SMOOTH_SHADOW_RADIUS 0.000488
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z + 0.0001), 0.0);
#endif
#endif
@ -184,16 +186,15 @@ void main() {
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
shadowWorldPos4f.xyz += normalVector3f * 0.1;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z + 0.0001), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
@ -201,7 +202,7 @@ void main() {
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
shadowSample *= SMOOTH_SHADOW_SAMPLES;
#endif
break;
}
@ -252,8 +253,8 @@ void main() {
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
reflectDir.xz = reflectDir.xz * vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, -0.25));
reflectDir.xz += vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0 , 0.25, 0.75));
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
@ -291,7 +292,7 @@ void main() {
float fogFade = 0.0;
if(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float atmos = COMPARE_LT_C_C(u_fogParameters4f.x, 4.0, 0.0, 4.0);
float type = u_fogParameters4f.x - atmos;
fogFade = mix(u_fogColorDark4f.a, u_fogColorLight4f.a, lightmapCoords2f.g);

View File

@ -53,7 +53,7 @@ void main() {
#endif
#ifdef DEBUG_VIEW_3
vec4 color4f = textureLod(u_texture0, v_position2f, 0.0);
output4f = vec4(color4f.b > 0.99 ? 1.0 : 0.0, color4f.a, 0.0, 1.0);
output4f = vec4((color4f.a - (color4f.a > 0.5 ? 0.5 : 0.0)) * 2.0, color4f.a > 0.5 ? 1.0 : 0.0, color4f.b > 0.99 ? 1.0 : 0.0, 1.0);
#endif
#ifdef DEBUG_VIEW_4
output4f = vec4(vec3(clamp((textureLod(u_texture0, v_position2f, 0.0).r - u_depthSliceStartEnd2f.x) * u_depthSliceStartEnd2f.y, 0.0, 1.0)), 1.0);

View File

@ -0,0 +1,35 @@
/*
* Copyright (c) 2025 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
// Assuming modern GPUs probably implement clamp, max, and ciel without branches
// value1 > value2 ? 1.0 : 0.0
#define COMPARE_GT_0_1(value1, value2) clamp(ceil(value1 - value2), 0.0, 1.0)
// value1 > value2 ? N : 0.0
#define COMPARE_GT_0_ANY(value1, value2) max(ceil(value1 - value2), 0.0)
// value1 < value2 ? 1.0 : 0.0
#define COMPARE_LT_0_1(value1, value2) clamp(ceil(value2 - value1), 0.0, 1.0)
// value1 < value2 ? N : 0.0
#define COMPARE_LT_0_ANY(value1, value2) max(ceil(value2 - value1), 0.0)
// value1 > value2 ? ifGT : ifLT
#define COMPARE_GT_C_C(value1, value2, ifGT, ifLT) (COMPARE_GT_0_1(value1, value2) * (ifGT - ifLT) + ifLT)
// value1 < value2 ? ifLT : ifGT
#define COMPARE_LT_C_C(value1, value2, ifLT, ifGT) (COMPARE_LT_0_1(value1, value2) * (ifLT - ifGT) + ifGT)

View File

@ -37,6 +37,9 @@ uniform mat4 u_inverseProjectionMatrix4f;
#ifdef COMPILE_SUN_SHADOW
uniform sampler2D u_sunShadowTexture;
#endif
#ifdef COMPILE_SUBSURFACE_SCATTERING
uniform sampler2D u_subsurfaceScatteringTexture;
#endif
uniform vec3 u_sunDirection3f;
uniform vec3 u_sunColor3f;
@ -49,30 +52,64 @@ void main() {
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
vec4 sampleVar4f;
#ifdef COMPILE_SUBSURFACE_SCATTERING
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(depth == 0.0) {
discard;
}
sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
diffuseColor3f.rgb = sampleVar4f.rgb;
diffuseColor3f *= diffuseColor3f;
lightmapCoords2f.x = sampleVar4f.a;
#endif
#ifdef COMPILE_SUBSURFACE_SCATTERING
float subsurfValue = textureLod(u_subsurfaceScatteringTexture, v_position2f, 0.0).r;
subsurfValue *= subsurfValue;
output4f = vec4(subsurfValue * u_sunColor3f * diffuseColor3f * 0.125, 0.0);
#endif
#ifdef COMPILE_SUN_SHADOW
#ifdef COMPILE_COLORED_SHADOW
vec4 shadow = textureLod(u_sunShadowTexture, v_position2f, 0.0);
if(shadow.a < 0.05) {
#ifndef COMPILE_SUBSURFACE_SCATTERING
discard;
#else
return;
#endif
}
#else
vec3 shadow = vec3(textureLod(u_sunShadowTexture, v_position2f, 0.0).r);
#ifndef COMPILE_SUBSURFACE_SCATTERING
if(shadow.r < 0.05) {
#ifndef COMPILE_SUBSURFACE_SCATTERING
discard;
#else
return;
#endif
}
#endif
#endif
#endif
#ifndef COMPILE_SUBSURFACE_SCATTERING
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
#endif
#ifndef COMPILE_SUN_SHADOW
if(depth == 0.0) {
#ifndef COMPILE_SUBSURFACE_SCATTERING
discard;
#else
return;
#endif
}
#endif
vec4 sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
#ifndef COMPILE_SUN_SHADOW
vec3 shadow = vec3(sampleVar4f.a, 0.0, 0.0);
@ -85,9 +122,12 @@ void main() {
normalVector3f.xyz = sampleVar4f.rgb * 2.0 - 1.0;
lightmapCoords2f.y = sampleVar4f.a;
#ifndef COMPILE_SUBSURFACE_SCATTERING
sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
diffuseColor3f.rgb = sampleVar4f.rgb;
diffuseColor3f *= diffuseColor3f;
lightmapCoords2f.x = sampleVar4f.a;
#endif
materialData3f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0).rgb;
vec3 worldSpaceNormal = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
@ -97,6 +137,15 @@ void main() {
worldSpacePosition = u_inverseProjectionMatrix4f * worldSpacePosition;
worldSpacePosition = u_inverseViewMatrix4f * vec4(worldSpacePosition.xyz / worldSpacePosition.w, 0.0);
diffuseColor3f *= diffuseColor3f;
output4f = vec4(eaglercraftLighting(diffuseColor3f, u_sunColor3f * shadow.rgb, normalize(-worldSpacePosition.xyz), u_sunDirection3f, worldSpaceNormal, materialData3f), 0.0);
}
#ifdef COMPILE_SUBSURFACE_SCATTERING
output4f.rgb +=
#else
output4f = vec4(
#endif
eaglercraftLighting(diffuseColor3f, u_sunColor3f * shadow.rgb, normalize(-worldSpacePosition.xyz), u_sunDirection3f, worldSpaceNormal, materialData3f)
#ifdef COMPILE_SUBSURFACE_SCATTERING
* (1.0 - subsurfValue * 0.0625);
#else
, 0.0);
#endif
}

View File

@ -1,7 +1,7 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
* Copyright (c) 2023-2025 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@ -31,21 +31,40 @@ uniform vec3 u_lightDir3f;
uniform sampler2D u_moonTextures;
uniform sampler2D u_cloudsTexture;
#define MOON_SURFACE 0.9
#define MOON_MARGIN 0.0125
void main() {
gl_FragDepth = 0.0;
vec4 color4f = texture(u_moonTextures, v_position2f);
if(color4f.a < 0.99) {
discard;
vec2 coord2f = v_position2f * 2.0 - 1.0;
vec2 texUV = (coord2f * (1.0 / (MOON_SURFACE + MOON_MARGIN))) * 0.5 + 0.5;
vec4 color4f = vec4(0.0);
if(texUV == clamp(texUV, vec2(0.0), vec2(1.0))) {
color4f = texture(u_moonTextures, texUV);
}
vec3 moonNormal3f;
moonNormal3f.xy = color4f.rg * 2.0 - 1.0;
moonNormal3f.z = sqrt(1.0 - dot(moonNormal3f.xy, moonNormal3f.xy));
float NdotV = dot(moonNormal3f, u_lightDir3f);
output4f = vec4(u_moonColor3f * (color4f.b * color4f.b * mix(max(NdotV, 0.0), max(NdotV + 0.45, 0.0) * 0.5f, max(u_lightDir3f.z * u_lightDir3f.z * -u_lightDir3f.z, 0.0))), 0.0);
float NdotV = max(dot(moonNormal3f, u_lightDir3f), 0.0);
vec3 viewDir = normalize(v_position3f);
vec2 surfaceCoord2f = coord2f * (1.0 / MOON_SURFACE);
vec3 moonAtmosNormalInner3f = vec3(surfaceCoord2f, sqrt(1.0 - dot(surfaceCoord2f, surfaceCoord2f)));
vec3 moonAtmosNormalOuter3f = vec3(surfaceCoord2f, sqrt(-1.0 + dot(surfaceCoord2f, surfaceCoord2f)));
float NdotVInner = max(dot(moonAtmosNormalInner3f, u_lightDir3f), 0.0);
float NdotVOuter = max(dot(moonAtmosNormalOuter3f, u_lightDir3f) + 0.65, 0.0);
float atmosInner = max((MOON_SURFACE * 0.2) / moonAtmosNormalInner3f.z - 0.2, 0.0);
float atmosOuter = max((MOON_SURFACE * 0.2) / moonAtmosNormalOuter3f.z - 0.4, 0.0);
output4f = vec4(u_moonColor3f * (color4f.b * color4f.b * NdotV + (NdotVInner * atmosInner + NdotVOuter * atmosOuter * vec3(0.8, 0.825, 0.9)) * (0.5 - max(u_lightDir3f.z, 0.0) * 0.25)), 0.0);
if(viewDir.y < 0.01) {
return;
}
vec2 cloudSampleCoord2f = (viewDir.xz / (viewDir.y + 1.0)) * 0.975 * 0.5 + 0.5;
vec4 cloudSample = textureLod(u_cloudsTexture, cloudSampleCoord2f, 0.0);
output4f.rgb = mix(output4f.rgb, output4f.rgb * max(cloudSample.a * 1.25 - 0.25, 0.0), smoothstep(0.0, 1.0, min(viewDir.y * 8.0, 1.0)));

View File

@ -19,7 +19,6 @@
precision highp sampler2DShadow;
in vec4 v_position4f;
in vec3 v_positionClip3f;
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
@ -102,14 +101,14 @@ vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_SAMPLES (1.0 / 8.0)
#define SMOOTH_SHADOW_RADIUS 0.000488
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z + 0.0001), 0.0);
#endif
#endif
@ -120,13 +119,11 @@ uniform sampler2D u_refractionMap;
uniform sampler2D u_brdfLUT;
uniform sampler2D u_normalMap;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
uniform sampler2D u_lightShaftsTexture;
#endif
uniform vec4 u_waterWindOffset4f;
uniform vec3 u_wavingBlockOffset3f;
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
#define WATER_ROUGHNESS 0.05
#define WATER_F0 0.5
@ -301,16 +298,15 @@ void main() {
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
shadowWorldPos4f.xyz += normalVector3f * 0.1;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z + 0.0001), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
@ -318,7 +314,7 @@ void main() {
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
shadowSample *= SMOOTH_SHADOW_SAMPLES;
#endif
break;
}
@ -356,8 +352,8 @@ void main() {
lightmapCoords2f *= lightmapCoords2f;
float e = 0.0;
e += envMapSample4f.g <= 0.0 ? 0.0 : 1.0;
e += lightmapCoords2f.y > 0.5 ? 0.0 : 1.0;
e += COMPARE_GT_0_ANY(envMapSample4f.g, 0.0);
e += COMPARE_LT_0_ANY(lightmapCoords2f.y, 0.5);
//e += abs(normalVector3f.y) > 0.1 ? 0.0 : 1.0;
if(e == 0.0) {
vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
@ -370,8 +366,8 @@ void main() {
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz *= vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
reflectDir.xz *= vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, -0.25));
reflectDir.xz += vec2(0.5, COMPARE_GT_C_C(reflectDir.y, 0.0, 0.25, 0.75));
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
envMapSample4f.rgb *= (lightmapCoords2f.y * 2.0 - 1.0);
@ -405,47 +401,11 @@ void main() {
#endif
// ============ CACLULATE FOG ============= //
vec4 fogBlend4f = vec4(0.0);
while(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float type = u_fogParameters4f.x - atmos;
fogBlend4f = mix(u_fogColorLight4f, u_fogColorDark4f, lightmapCoords2f.g);
float f, l = length(v_position4f.xyz);
if(type == 1.0) {
f = (l - u_fogParameters4f.z) / (u_fogParameters4f.w - u_fogParameters4f.z);
}else {
f = 1.0 - exp(-u_fogParameters4f.y * l);
}
fogBlend4f.a *= clamp(f, 0.0, 1.0);
if(atmos == 0.0) {
break;
}
vec3 atmosSamplePos = v_position4f.xyz / -l;
atmosSamplePos.xz /= abs(atmosSamplePos.y) + 1.0;
atmosSamplePos.xz *= vec2(-0.5, -0.25) * 0.75;
atmosSamplePos.xz += vec2(0.5, 0.25);
fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb + u_fogColorAddSun4f.rgb;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
fogBlend4f.a = fogBlend4f.a * 0.85 + 0.2;
#endif
break;
}
// ============ OUTPUT COLOR ============== //
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
vec3 skyLight = (lightmapCoords2f.g + 0.05) * vec3(0.9102, 0.9, 1.0) * u_blockSkySunDynamicLightFac4f.y;
diffuseColor4f.rgb *= (skyLight + blockLight) * 0.075;
diffuseColor4f.rgb += lightColor3f;
diffuseColor4f.rgb = mix(diffuseColor4f.rgb + refractionSample.rgb, fogBlend4f.rgb, fogBlend4f.a);
diffuseColor4f.rgb += lightColor3f + refractionSample.rgb;
output4f = vec4(diffuseColor4f.rgb, 1.0);
}

View File

@ -20,10 +20,6 @@ in vec3 a_position3f;
out vec4 v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
out vec3 v_positionClip3f;
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
@ -75,8 +71,4 @@ void main() {
#endif
gl_Position = u_projectionMat4f * v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
v_positionClip3f = gl_Position.xyw;
#endif
}

View File

@ -84,6 +84,8 @@ uniform vec4 u_nearFarPlane4f;
uniform vec4 u_pixelAlignment4f;
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
#define reprojDepthLimit 0.25
#define GET_LINEAR_DEPTH_FROM_VALUE(depthSample) (u_nearFarPlane4f.z / (u_nearFarPlane4f.y + u_nearFarPlane4f.x + (depthSample * 2.0 - 1.0) * u_nearFarPlane4f.w))
@ -135,9 +137,9 @@ void main() {
#ifdef COMPILE_REPROJECT_SSR
vec4 materials = textureLod(u_gbufferMaterialTexture, v_position2f2, 0.0);
float f = materials.g < 0.06 ? 1.0 : 0.0;
f += materials.r < 0.5 ? 1.0 : 0.0;
f += materials.a > 0.5 ? 1.0 : 0.0;
float f = COMPARE_LT_0_ANY(materials.g, 0.06);
f += COMPARE_LT_0_ANY(materials.r, 0.5);
f += COMPARE_GT_0_ANY(materials.a, 0.5);
if(f > 0.0) {
return;
}

View File

@ -1,7 +1,7 @@
{
"name": "§eHigh Performance PBR",
"desc": "Pack made from scratch specifically for this client, designed to give what I call the best balance between quality and performance possible in a browser but obviously that's just my opinion",
"vers": "1.3.1",
"vers": "1.4.0",
"author": "lax1dude",
"api_vers": 1,
"features": [
@ -19,6 +19,7 @@
"POST_LENS_DISTORION",
"POST_LENS_FLARES",
"POST_BLOOM",
"POST_FXAA"
"POST_FXAA",
"SUBSURFACE_SCATTERING"
]
}

View File

@ -60,14 +60,14 @@ vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_SAMPLES (1.0 / 8.0)
#define SMOOTH_SHADOW_RADIUS 0.000488
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z + 0.0001), 0.0);
#endif
uniform vec3 u_sunDirection3f;
@ -97,7 +97,7 @@ void main() {
worldSpacePosition.xyz -= 1.0;
worldSpacePosition = u_inverseViewProjMatrix4f * worldSpacePosition;
worldSpacePosition.xyz /= worldSpacePosition.w;
worldSpacePosition.xyz += worldSpaceNormal * 0.05;
worldSpacePosition.xyz += worldSpaceNormal * 0.1;
worldSpacePosition.w = 1.0;
float skyLight = max(normalVector4f.a * 2.0 - 1.0, 0.0);
float shadowSample;
@ -106,9 +106,8 @@ void main() {
for(;;) {
shadowSpacePosition = u_sunShadowMatrixLOD04f * worldSpacePosition;
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowSpacePosition.z), 0.0);
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowSpacePosition.z + 0.0001), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
@ -116,7 +115,7 @@ void main() {
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
shadowSample *= SMOOTH_SHADOW_SAMPLES;
#endif
#ifdef COMPILE_COLORED_SHADOW
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;

View File

@ -23,6 +23,10 @@ precision highp sampler2D;
in vec3 v_position3f;
in vec3 v_color3f;
#ifndef COMPILE_PARABOLOID_SKY
in vec3 v_positionClip3f;
#endif
layout(location = 0) out vec4 output4f;
uniform vec3 u_sunDirection3f;
@ -33,10 +37,15 @@ uniform vec4 u_lightningColor4f;
uniform sampler2D u_cloudsTexture;
#endif
#ifndef COMPILE_PARABOLOID_SKY
uniform sampler2D u_sunOcclusion;
uniform sampler2D u_gbufferDepthTexture;
#endif
#define SKY_BRIGHTNESS 5.0
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
void main() {
gl_FragDepth = 0.0;
vec3 viewDir = normalize(v_position3f);
@ -46,6 +55,7 @@ void main() {
float f = max(dot(viewDir, u_sunDirection3f) - 0.995, 0.0) * 100.0;
float intensity = min(f * 2.0, 1.0);
intensity *= intensity * intensity * intensity * textureLod(u_sunOcclusion, vec2(0.5, 0.5), 0.0).r * 2.0;
intensity *= 1.0 - COMPARE_GT_0_1(textureLod(u_gbufferDepthTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r, 0.0);
output4f = vec4(v_color3f * SKY_BRIGHTNESS + intensity * u_sunColor3f, 0.0);
#endif
#ifdef COMPILE_CLOUDS

View File

@ -26,6 +26,10 @@ layout(location = 1) in vec2 a_colorIndex2f;
out vec3 v_position3f;
out vec3 v_color3f;
#ifndef COMPILE_PARABOLOID_SKY
out vec3 v_positionClip3f;
#endif
uniform mat4 u_viewMatrix4f;
#ifdef COMPILE_PARABOLOID_SKY
uniform float u_farPlane1f;
@ -47,5 +51,6 @@ void main() {
gl_Position = vec4(pos.xyz, 1.0);
#else
gl_Position = u_projMatrix4f * vec4(pos.xyz, 1.0);
v_positionClip3f = gl_Position.xyw;
#endif
}

View File

@ -33,6 +33,8 @@ uniform mat4 u_inverseProjectionMatrix4f;
uniform mat2 u_randomizerDataMatrix2f;
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
const vec3 ssaoKernel[8] = vec3[](
vec3(0.599,0.721,0.350),vec3(0.114,0.791,0.601),
vec3(0.067,0.995,0.069),vec3(0.511,-0.510,0.692),
@ -48,8 +50,8 @@ vec3(0.716,-0.439,0.543),vec3(-0.400,0.733,0.550));
tmpVec4_2.zw = matProjInv2f * vec4(tmpVec4_2.xy, textureLod(u_gbufferDepthTexture, tmpVec4_2.xy * 0.5 + 0.5, 0.0).r * 2.0 - 1.0, 1.0);\
tmpVec4_2.z /= tmpVec4_2.w;\
tmpVec4_2.x = smoothstep(0.0, 1.0, radius * 0.5 / abs(pos.z - tmpVec4_2.z));\
divisor += tmpVec4_2.x > 0.0 ? 1.0 : 0.0;\
occlusion += (tmpVec4_2.z >= tmpVec4_1.z ? 1.0 : 0.0) * tmpVec4_2.x;
divisor += COMPARE_GT_0_1(tmpVec4_2.x, 0.0);\
occlusion += COMPARE_GT_0_1(tmpVec4_2.z, tmpVec4_1.z) * tmpVec4_2.x;
void main() {
vec3 originalClipSpacePos = vec3(v_position2f, textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r);

View File

@ -0,0 +1,158 @@
#line 2
/*
* Copyright (c) 2025 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float output1f;
uniform mat4 u_inverseViewMatrix4f;
uniform mat4 u_inverseViewProjMatrix4f;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_sunShadowDepthTexture;
#ifdef COMPILE_SUN_SHADOW_LOD0
uniform mat4 u_sunShadowMatrixLOD04f;
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
uniform mat4 u_sunShadowMatrixLOD04f;
uniform mat4 u_sunShadowMatrixLOD14f;
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
uniform mat4 u_sunShadowMatrixLOD04f;
uniform mat4 u_sunShadowMatrixLOD14f;
uniform mat4 u_sunShadowMatrixLOD24f;
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/branchless_comparison.glsl"
const vec2 POISSON_DISK[4] = vec2[](
vec2(0.998, -0.0438),
vec2(-0.345, -0.933),
vec2(-0.996, 0.046),
vec2(0.230, 0.960));
#define SMOOTH_SHADOW_SAMPLES (1.0 / 5.0)
#define SMOOTH_SHADOW_RADIUS 0.000488
#define SCATTER_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += scatterSampleInterpolated(tex, vec3(tmpVec2, vec3Pos.z));
#define SUN_SHADOW_DEPTH_SIZE_2F vec2(SUN_SHADOW_DEPTH_SIZE_2F_X, SUN_SHADOW_DEPTH_SIZE_2F_Y)
#define SUN_SHADOW_DEPTH_SIZE_2F_INV vec2((1.0 / SUN_SHADOW_DEPTH_SIZE_2F_X), (1.0 / SUN_SHADOW_DEPTH_SIZE_2F_Y))
uniform vec3 u_sunDirection3f;
#define SCATTER_SAMPLE(tex, vec2Pos, comp) max(textureLod(tex, (vec2Pos), 0.0).r - comp, 0.0)
float scatterSampleInterpolated(in sampler2D texIn, in vec3 vec3Pos) {
vec2 icoord2f = vec3Pos.xy * SUN_SHADOW_DEPTH_SIZE_2F;
vec2 floor2fTmp = floor(icoord2f);
vec2 ceil2fTmp = ceil(icoord2f);
vec2 ret1 = vec2( // top two samples
SCATTER_SAMPLE(texIn, (floor2fTmp + 0.5) * SUN_SHADOW_DEPTH_SIZE_2F_INV, vec3Pos.z),
SCATTER_SAMPLE(texIn, (vec2(ceil2fTmp.x, floor2fTmp.y) + 0.5) * SUN_SHADOW_DEPTH_SIZE_2F_INV, vec3Pos.z)
);
vec2 ret2 = vec2( // bottom two samples
SCATTER_SAMPLE(texIn, (vec2(floor2fTmp.x, ceil2fTmp.y) + 0.5) * SUN_SHADOW_DEPTH_SIZE_2F_INV, vec3Pos.z),
SCATTER_SAMPLE(texIn, (ceil2fTmp + 0.5) * SUN_SHADOW_DEPTH_SIZE_2F_INV, vec3Pos.z)
);
vec2 factors = icoord2f - floor2fTmp;
vec2 cunt = vec2(1.0 - factors.x, factors.x);
ret1 = ret1 * cunt * (1.0 - factors.y) + ret2 * cunt * factors.y;
return (ret1.x + ret1.y) * 0.25;
}
void main() {
output1f = 0.0;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(depth == 0.0) {
return;
}
float material1f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0).a;
material1f = 2.0 * material1f - COMPARE_GT_0_1(material1f, 0.5);
if(material1f < 0.05) {
return;
}
vec4 normalVector4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
if(normalVector4f.a < 0.5) {
return;
}
normalVector4f.xyz *= 2.0;
normalVector4f.xyz -= 1.0;
vec3 worldSpaceNormal = normalize(mat3(u_inverseViewMatrix4f) * normalVector4f.xyz);
vec4 worldSpacePosition = vec4(v_position2f, depth, 1.0);
worldSpacePosition.xyz *= 2.0;
worldSpacePosition.xyz -= 1.0;
worldSpacePosition = u_inverseViewProjMatrix4f * worldSpacePosition;
worldSpacePosition.xyz /= worldSpacePosition.w;
worldSpacePosition.xyz += worldSpaceNormal * 0.05;
worldSpacePosition.w = 1.0;
float shadowSample;
vec2 tmpVec2;
vec4 shadowSpacePosition;
for(;;) {
shadowSpacePosition = u_sunShadowMatrixLOD04f * worldSpacePosition;
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = scatterSampleInterpolated(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowSpacePosition.z));
SCATTER_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
SCATTER_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
SCATTER_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
SCATTER_POISSON_SAMPLE(3, u_sunShadowDepthTexture, 0.0, shadowSpacePosition.xyz, shadowSample, tmpVec2)
shadowSample *= SMOOTH_SHADOW_SAMPLES;
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowSpacePosition = u_sunShadowMatrixLOD14f * worldSpacePosition;
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSpacePosition.y += 1.0;
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = scatterSampleInterpolated(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy, shadowSpacePosition.z + 0.00015));
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowSpacePosition = u_sunShadowMatrixLOD24f * worldSpacePosition;
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSpacePosition.y += 2.0;
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = scatterSampleInterpolated(u_sunShadowDepthTexture, vec3(shadowSpacePosition.xy, shadowSpacePosition.z + 0.00015));
break;
}
#endif
output1f = normalVector4f.a * min(material1f, 0.5);
return;
}
material1f = (1.0 - material1f) * 512.0;
output1f = max(1.0 - shadowSample * material1f, 0.0);
}