Update #53 - Improved FPS, reduced WebGL context loss crashes

This commit is contained in:
lax1dude
2025-07-06 12:31:55 -07:00
parent f3281c037f
commit 332a7bb11f
53 changed files with 568 additions and 383 deletions

View File

@ -63,7 +63,7 @@ uniform float u_alphaTestRef1f;
#ifdef COMPILE_ENABLE_MC_LIGHTING
uniform int u_lightsEnabled1i;
uniform vec4 u_lightsDirections4fv[4];
uniform vec4 u_lightsDirections4fv[2];
uniform vec3 u_lightsAmbient3f;
#ifndef COMPILE_NORMAL_ATTRIB
uniform vec3 u_uniformNormal3f;
@ -166,20 +166,14 @@ void main() {
#else
vec3 normal = u_uniformNormal3f;
#endif
float diffuse = 0.0;
vec4 light;
#ifdef EAGLER_HAS_GLES_300
for(int i = 0; i < u_lightsEnabled1i; ++i) {
#else
for(int i = 0; i < 4; ++i) {
#endif
light = u_lightsDirections4fv[i];
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
#ifndef EAGLER_HAS_GLES_300
if(i + 1 >= u_lightsEnabled1i) {
float diffuse = 0.0;
for(int i = 0; i < 2; ++i) {
if(i >= u_lightsEnabled1i) {
break;
}
#endif
light = u_lightsDirections4fv[i];
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
}
color.rgb *= min(u_lightsAmbient3f + vec3(diffuse), 1.0);
#endif

View File

@ -20,7 +20,6 @@ precision lowp int;
precision mediump float;
precision mediump sampler2D;
in vec4 v_position4f;
in vec2 v_texCoord2f;
in vec4 v_color4f;
in vec2 v_lightmap2f;
@ -30,16 +29,6 @@ layout(location = 0) out vec4 output4f;
uniform sampler2D u_inputTexture;
uniform sampler2D u_lightmapTexture;
uniform mat4 u_inverseViewMatrix4f;
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
mediump vec4 u_dynamicLightArray[12];
};
void main() {
vec4 color = texture(u_inputTexture, v_texCoord2f) * v_color4f;
@ -47,20 +36,7 @@ void main() {
discard;
}
vec4 dlight;
float blockLight = v_lightmap2f.x;
if(u_dynamicLightCount1i > 0) {
vec4 worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i;
for(int i = 0; i < safeLightCount; ++i) {
dlight = u_dynamicLightArray[i];
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
}
}
color *= texture(u_lightmapTexture, vec2(blockLight, v_lightmap2f.y));
color *= texture(u_lightmapTexture, v_lightmap2f);
output4f = color;
}

View File

@ -28,21 +28,27 @@ layout(location = 3) in vec2 p_lightMap2f;
layout(location = 4) in vec2 p_particleSize_texCoordsSize_2i;
layout(location = 5) in vec4 p_color4f;
out vec4 v_position4f;
out vec2 v_texCoord2f;
out vec4 v_color4f;
out vec2 v_lightmap2f;
uniform mat4 u_modelViewMatrix4f;
uniform mat4 u_projectionMatrix4f;
uniform mat4 u_inverseViewMatrix4f;
uniform vec3 u_texCoordSize2f_particleSize1f;
uniform vec3 u_transformParam_1_2_5_f;
uniform vec2 u_transformParam_3_4_f;
uniform vec4 u_color4f;
layout(std140) uniform u_chunkLightingData {
mediump uvec2 u_dynamicLightOffsetCount2i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump uvec4 u_dynamicLightArray[4];
};
void main() {
v_color4f = u_color4f * p_color4f.bgra;
v_lightmap2f = p_lightMap2f;
vec2 tex2f = a_position2f * 0.5 + 0.5;
tex2f.y = 1.0 - tex2f.y;
@ -56,6 +62,40 @@ void main() {
pos3f += u_transformParam_1_2_5_f * spos2f.xyy;
pos3f.zx += u_transformParam_3_4_f * spos2f;
v_position4f = u_modelViewMatrix4f * vec4(pos3f, 1.0);
gl_Position = u_projectionMatrix4f * v_position4f;
vec4 pos4f = u_modelViewMatrix4f * vec4(pos3f, 1.0);
gl_Position = u_projectionMatrix4f * pos4f;
float blockLight = 0.0;
vec4 dlight;
uvec4 dlighti1, dlighti2;
if(u_dynamicLightOffsetCount2i.y > 0u) {
vec3 dlightOffset = vec3(ivec3(
int(u_dynamicLightOffsetCount2i.x << 16),
int(u_dynamicLightOffsetCount2i.x << 8),
int(u_dynamicLightOffsetCount2i.x)
) >> 24);
vec4 worldPosition4f = u_inverseViewMatrix4f * pos4f;
worldPosition4f.xyz = worldPosition4f.xyz / worldPosition4f.w + dlightOffset;
for(uint i = 0u; i < 4u; ++i) {
dlighti1 = u_dynamicLightArray[i];
dlighti2 = dlighti1 << 16;
dlight = vec4(ivec4(ivec2(dlighti2.xy), ivec2(dlighti1.xy)) >> 16) * 0.0009765923;
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
if(i * 2u + 1u >= u_dynamicLightOffsetCount2i.y) {
break;
}
dlight = vec4(ivec4(ivec2(dlighti2.zw), ivec2(dlighti1.zw)) >> 16) * 0.0009765923;
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
if(i * 2u + 2u >= u_dynamicLightOffsetCount2i.y) {
break;
}
}
}
v_lightmap2f = vec2(max(p_lightMap2f.x, blockLight), p_lightMap2f.y);
}

View File

@ -16,7 +16,9 @@
*
*/
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
in vec4 v_position4f;
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
@ -61,7 +63,7 @@ uniform float u_alphaTestRef1f;
#ifdef COMPILE_ENABLE_MC_LIGHTING
uniform int u_lightsEnabled1i;
uniform vec4 u_lightsDirections4fv[4];
uniform vec4 u_lightsDirections4fv[2];
uniform vec3 u_lightsAmbient3f;
#endif
@ -88,15 +90,9 @@ uniform mat4 u_textureMat4f01;
uniform vec2 u_textureAnisotropicFix;
#endif
uniform mat4 u_inverseViewMatrix4f;
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
mediump vec4 u_dynamicLightArray[12];
};
#ifdef COMPILE_ENABLE_LIGHTMAP
in float v_dynamicLight1f;
#endif
layout(location = 0) out vec4 output4f;
@ -151,17 +147,9 @@ void main() {
#else
float blockLight = u_textureCoords02.x;
#endif
vec4 dlight;
if(u_dynamicLightCount1i > 0) {
vec4 worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i;
for(int i = 0; i < safeLightCount; ++i) {
dlight = u_dynamicLightArray[i];
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
}
}
blockLight = max(blockLight, v_dynamicLight1f);
#ifdef COMPILE_LIGHTMAP_ATTRIB
color *= texture(u_samplerLightmap, vec2(blockLight, v_lightmap2f.y));
#else
@ -179,16 +167,18 @@ void main() {
#endif
#ifdef COMPILE_ENABLE_MC_LIGHTING
#ifdef COMPILE_NORMAL_ATTRIB
vec3 normal = v_normal3f;
#else
vec3 normal = u_uniformNormal3f;
#endif
#ifdef COMPILE_ENABLE_MC_LIGHTING
vec4 light;
float diffuse = 0.0;
for(int i = 0; i < u_lightsEnabled1i; ++i) {
for(int i = 0; i < 2; ++i) {
if(i >= u_lightsEnabled1i) {
break;
}
light = u_lightsDirections4fv[i];
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
}

View File

@ -18,7 +18,13 @@
in vec3 a_position3f;
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
#define _COMPILE_VARYING_POSITION
#endif
#ifdef _COMPILE_VARYING_POSITION
out vec4 v_position4f;
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
out vec3 v_objectPosition3f;
@ -46,16 +52,32 @@ out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
out float v_dynamicLight1f;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
uniform mat4 u_inverseViewMatrix4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
layout(std140) uniform u_chunkLightingData {
mediump uvec2 u_dynamicLightOffsetCount2i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump uvec4 u_dynamicLightArray[4];
};
void main() {
#ifdef COMPILE_ENABLE_TEX_GEN
v_objectPosition3f = a_position3f;
#endif
#ifndef _COMPILE_VARYING_POSITION
vec4 v_position4f;
#endif
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#ifdef COMPILE_TEXTURE_ATTRIB
@ -75,6 +97,42 @@ void main() {
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
gl_Position = u_projectionMat4f * v_position4f;
#ifdef COMPILE_ENABLE_LIGHTMAP
float blockLight = 0.0;
vec4 dlight;
uvec4 dlighti1, dlighti2;
if(u_dynamicLightOffsetCount2i.y > 0u) {
vec3 dlightOffset = vec3(ivec3(
int(u_dynamicLightOffsetCount2i.x << 16),
int(u_dynamicLightOffsetCount2i.x << 8),
int(u_dynamicLightOffsetCount2i.x)
) >> 24);
vec4 worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz = worldPosition4f.xyz / worldPosition4f.w + dlightOffset;
for(uint i = 0u; i < 4u; ++i) {
dlighti1 = u_dynamicLightArray[i];
dlighti2 = dlighti1 << 16;
dlight = vec4(ivec4(ivec2(dlighti2.xy), ivec2(dlighti1.xy)) >> 16) * 0.0009765923;
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
if(i * 2u + 1u >= u_dynamicLightOffsetCount2i.y) {
break;
}
dlight = vec4(ivec4(ivec2(dlighti2.zw), ivec2(dlighti1.zw)) >> 16) * 0.0009765923;
dlight.xyz = dlight.xyz - worldPosition4f.xyz;
blockLight = max((dlight.w - length(dlight.xyz)) * 0.066667, blockLight);
if(i * 2u + 2u >= u_dynamicLightOffsetCount2i.y) {
break;
}
}
}
v_dynamicLight1f = blockLight;
#endif
}