From 31f67803b9cdaea8c3d9dff1c0761af8db093480 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 24 Mar 2021 19:20:30 +0100 Subject: [PATCH] rendering: workaround for mesa drivers --- .../rendering/shader/chunk_fragment.glsl | 17 +++++++++++++++-- .../minosoft/rendering/shader/hud_fragment.glsl | 17 ++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/minosoft/rendering/shader/chunk_fragment.glsl b/src/main/resources/assets/minosoft/rendering/shader/chunk_fragment.glsl index cf562b68a..d18f68f47 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/chunk_fragment.glsl +++ b/src/main/resources/assets/minosoft/rendering/shader/chunk_fragment.glsl @@ -25,8 +25,21 @@ in vec4 passTintColor; uniform sampler2DArray textureArray[7]; +vec4 getTexture(uint textureId, vec3 textureCoordinates){ + switch (textureId){ + case 0u : return texture(textureArray[0], textureCoordinates); + case 1u: return texture(textureArray[1], textureCoordinates); + case 2u: return texture(textureArray[2], textureCoordinates); + case 3u: return texture(textureArray[3], textureCoordinates); + case 4u: return texture(textureArray[4], textureCoordinates); + case 5u: return texture(textureArray[5], textureCoordinates); + case 6u: return texture(textureArray[6], textureCoordinates); + } + return texture(textureArray[0], textureCoordinates); +} + void main() { - vec4 firstTexelColor = texture(textureArray[passFirstTextureIdIndex], passFirstTextureCoordinates); + vec4 firstTexelColor = getTexture(passFirstTextureIdIndex, passFirstTextureCoordinates); if (firstTexelColor.a == 0.0f) { // ToDo: This only works for alpha == 0. What about semi transparency? We would need to sort the faces, etc. See: https://learnopengl.com/Advanced-OpenGL/Blending discard; } @@ -36,7 +49,7 @@ void main() { return; } - vec4 secondTexelColor = texture(textureArray[passSecondTextureIdIndex], passSecondTextureCoordinates); + vec4 secondTexelColor = getTexture(passSecondTextureIdIndex, passSecondTextureCoordinates); if (secondTexelColor.a == 0.0f) { discard; diff --git a/src/main/resources/assets/minosoft/rendering/shader/hud_fragment.glsl b/src/main/resources/assets/minosoft/rendering/shader/hud_fragment.glsl index c4252482f..bf1712446 100644 --- a/src/main/resources/assets/minosoft/rendering/shader/hud_fragment.glsl +++ b/src/main/resources/assets/minosoft/rendering/shader/hud_fragment.glsl @@ -22,8 +22,23 @@ in vec4 passTintColor; uniform sampler2DArray textureArray[7]; + +vec4 getTexture(uint textureId, vec3 textureCoordinates) { // ToDo: This method is just stupid, @see chunk_fragment.glsl + switch (textureId){ + case 0u : return texture(textureArray[0], textureCoordinates); + case 1u: return texture(textureArray[1], textureCoordinates); + case 2u: return texture(textureArray[2], textureCoordinates); + case 3u: return texture(textureArray[3], textureCoordinates); + case 4u: return texture(textureArray[4], textureCoordinates); + case 5u: return texture(textureArray[5], textureCoordinates); + case 6u: return texture(textureArray[6], textureCoordinates); + } + return texture(textureArray[0], textureCoordinates); +} + + void main() { - vec4 texelColor = texture(textureArray[passTextureIdIndex], passTextureCoordinates); + vec4 texelColor = getTexture(passTextureIdIndex, passTextureCoordinates); if (passTintColor.a == 1.0f && texelColor.a == 0) { discard;