mirror of
https://github.com/Eaglercraft-Archive/Eaglercraftx-1.8.8-src.git
synced 2025-06-27 18:38:14 -05:00
Update #50 - Bug fixes and shader improvements
This commit is contained in:
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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)
|
@ -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
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -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)));
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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"
|
||||
]
|
||||
}
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
Reference in New Issue
Block a user