From 053e28a33ab395f4b75dabbad4bf0dac27aa74eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Szczepa=C5=84ski?= <jazz2rulez@gmail.com> Date: Sun, 9 Jan 2022 00:04:35 +0100 Subject: [PATCH] Avoid Intel graphics ivec3/uvec3 bug. --- assets/voxygen/shaders/fluid-vert.glsl | 3 ++- assets/voxygen/shaders/light-shadows-directed-vert.glsl | 4 ++-- assets/voxygen/shaders/point-light-shadows-vert.glsl | 4 ++-- assets/voxygen/shaders/sprite-vert.glsl | 8 ++++---- assets/voxygen/shaders/terrain-vert.glsl | 4 ++-- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/assets/voxygen/shaders/fluid-vert.glsl b/assets/voxygen/shaders/fluid-vert.glsl index 0d68559912..0b7c8b541e 100644 --- a/assets/voxygen/shaders/fluid-vert.glsl +++ b/assets/voxygen/shaders/fluid-vert.glsl @@ -49,7 +49,8 @@ layout(location = 1) flat out uint f_pos_norm; const float EXTRA_NEG_Z = 65536.0/*65536.1*/; void main() { - f_pos = vec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0x1FFFFu)) - vec3(0, 0, EXTRA_NEG_Z) + model_offs - focus_off.xyz; + f_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0x1FFFFu) - EXTRA_NEG_Z) + model_offs - focus_off.xyz; + // f_pos.z -= 250.0 * (1.0 - min(1.0001 - 0.02 / pow(tick.x - load_time, 10.0), 1.0)); // f_pos.z -= min(32.0, 25.0 * pow(distance(focus_pos.xy, f_pos.xy) / view_distance.x, 20.0)); diff --git a/assets/voxygen/shaders/light-shadows-directed-vert.glsl b/assets/voxygen/shaders/light-shadows-directed-vert.glsl index 99aeaa61b1..1ff6fbffd9 100644 --- a/assets/voxygen/shaders/light-shadows-directed-vert.glsl +++ b/assets/voxygen/shaders/light-shadows-directed-vert.glsl @@ -51,10 +51,10 @@ uniform u_locals { // out vec4 shadowMapCoord; -const int EXTRA_NEG_Z = 32768; +const float EXTRA_NEG_Z = 32768.0; void main() { - vec3 f_chunk_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z)); + vec3 f_chunk_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0xFFFFu) - EXTRA_NEG_Z); vec3 f_pos = f_chunk_pos + (model_offs - focus_off.xyz); // f_pos = v_pos; // vec3 f_pos = f_chunk_pos + model_offs; diff --git a/assets/voxygen/shaders/point-light-shadows-vert.glsl b/assets/voxygen/shaders/point-light-shadows-vert.glsl index 7670a2f368..507c831bc0 100644 --- a/assets/voxygen/shaders/point-light-shadows-vert.glsl +++ b/assets/voxygen/shaders/point-light-shadows-vert.glsl @@ -41,14 +41,14 @@ uniform u_locals { // out vec4 shadowMapCoord; -const int EXTRA_NEG_Z = 32768; +const float EXTRA_NEG_Z = 32768.0; layout( push_constant ) uniform PointLightMatrix { mat4 lightShadowMatrix; }; void main() { - vec3 f_chunk_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z)); + vec3 f_chunk_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0xFFFFu) - EXTRA_NEG_Z); vec3 f_pos = f_chunk_pos + model_offs - focus_off.xyz; // f_pos = v_pos; // vec3 f_pos = f_chunk_pos + model_offs; diff --git a/assets/voxygen/shaders/sprite-vert.glsl b/assets/voxygen/shaders/sprite-vert.glsl index 097e5e25f2..2cbd92f05f 100644 --- a/assets/voxygen/shaders/sprite-vert.glsl +++ b/assets/voxygen/shaders/sprite-vert.glsl @@ -51,8 +51,8 @@ layout(location = 4) out vec2 f_inst_light; const float SCALE = 1.0 / 11.0; const float SCALE_FACTOR = pow(SCALE, 1.3) * 0.2; -const int EXTRA_NEG_Z = 32768; -const int VERT_EXTRA_NEG_Z = 128; +const float EXTRA_NEG_Z = 32768.0; +const float VERT_EXTRA_NEG_Z = 128.0; const uint VERT_PAGE_SIZE = 256; void main() { @@ -75,7 +75,7 @@ void main() { uint v_atlas_pos = pos_atlas_pos_norm_ao.y; // Expand the model vertex position bits into float values - vec3 v_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 8, 16)) & uvec3(0xFFu, 0xFFu, 0x0FFFu)) - ivec3(0, 0, VERT_EXTRA_NEG_Z)); + vec3 v_pos = vec3(v_pos_norm & 0xFFu, (v_pos_norm >> 8) & 0xFFu, float((v_pos_norm >> 16) & 0x0FFFu) - VERT_EXTRA_NEG_Z); // Transform into chunk space and scale f_pos = (inst_mat * vec4(v_pos, 1.0)).xyz; @@ -118,7 +118,7 @@ void main() { // Position of the sprite block in the chunk // Used solely for highlighting the selected sprite - vec3 inst_chunk_pos = vec3(ivec3((uvec3(inst_pos_ori) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z)); + vec3 inst_chunk_pos = vec3(inst_pos_ori & 0x3Fu, (inst_pos_ori >> 6) & 0x3Fu, float((inst_pos_ori >> 12) & 0xFFFFu) - EXTRA_NEG_Z); // Select glowing vec3 sprite_pos = inst_chunk_pos + chunk_offs; f_select = (select_pos.w > 0 && select_pos.xyz == sprite_pos) ? 1.0 : 0.0; diff --git a/assets/voxygen/shaders/terrain-vert.glsl b/assets/voxygen/shaders/terrain-vert.glsl index 36be96776d..11bfd3254a 100644 --- a/assets/voxygen/shaders/terrain-vert.glsl +++ b/assets/voxygen/shaders/terrain-vert.glsl @@ -67,12 +67,12 @@ layout(location = 2) flat out float f_load_time; // uniform sampler2DRect t_col_light; -const int EXTRA_NEG_Z = 32768; +const float EXTRA_NEG_Z = 32768.0; void main() { // over it (if this vertex to see if it intersects. // f_chunk_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z)); - vec3 f_chunk_pos = vec3(ivec3((uvec3(v_pos_norm) >> uvec3(0, 6, 12)) & uvec3(0x3Fu, 0x3Fu, 0xFFFFu)) - ivec3(0, 0, EXTRA_NEG_Z)); + vec3 f_chunk_pos = vec3(v_pos_norm & 0x3Fu, (v_pos_norm >> 6) & 0x3Fu, float((v_pos_norm >> 12) & 0xFFFFu) - EXTRA_NEG_Z); f_pos = f_chunk_pos + model_offs - focus_off.xyz; f_load_time = load_time;