diff --git a/res/shaders/entity.glslf b/res/shaders/entity.glslf index a817d963a..47883c327 100644 --- a/res/shaders/entity.glslf +++ b/res/shaders/entity.glslf @@ -13,6 +13,7 @@ uniform vec3 u_fogColor; uniform float u_fogFactor; uniform float u_fogCurve; uniform bool u_alphaClip; +uniform bool u_dithering; uniform vec3 u_sunDir; const float BAYER_MATRIX[64] = float[]( @@ -35,13 +36,17 @@ void main() { vec4 texColor = texture(u_texture0, a_texCoord); float alpha = a_color.a * texColor.a; // anyway it's any alpha-test alternative required - if (u_alphaClip) { - float bayer = calc_bayer(gl_FragCoord.xy); - if (alpha - bayer < 0.01f) { + if (u_dithering) { + if (u_alphaClip) { + float bayer = calc_bayer(gl_FragCoord.xy); + if (alpha - bayer < 0.01f) { + discard; + } + alpha = 1.0; + } else if (alpha < 0.05f) { discard; } - alpha = 1.0; - } else if (alpha < 0.05f) { + } else if (alpha < (u_alphaClip ? 0.5f : 0.15f)) { discard; } f_color = a_color * texColor; diff --git a/src/graphics/render/BlockWrapsRenderer.cpp b/src/graphics/render/BlockWrapsRenderer.cpp index fb72d3347..168ad14a2 100644 --- a/src/graphics/render/BlockWrapsRenderer.cpp +++ b/src/graphics/render/BlockWrapsRenderer.cpp @@ -144,6 +144,7 @@ void BlockWrapsRenderer::draw(const DrawContext& pctx) { auto& shader = assets.require("entity"); shader.use(); shader.uniform1i("u_alphaClip", false); + shader.uniform1i("u_dithering", 0); for (const auto& [_, wrapper] : wrappers) { if (wrapper->dirtySides) { @@ -198,4 +199,4 @@ void BlockWrapsRenderer::clearOrder(const BlockWrapper* const wrapper) { ++it; } } -} \ No newline at end of file +} diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 051812756..e3dab25df 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -244,6 +244,7 @@ void WorldRenderer::renderOpaque( } entityShader.uniform1i("u_alphaClip", true); + entityShader.uniform1i("u_dithering", 1); entityShader.uniform1f("u_opacity", 1.0f); level.entities->render( assets, @@ -512,6 +513,7 @@ void WorldRenderer::renderWeatherEffects(Camera& camera) { float one = weather->fall.maxOpacity; float t = (weather->intensity * (one - zero)) * maxIntensity + zero; entityShader.uniform1i("u_alphaClip", weather->fall.opaque); + entityShader.uniform1i("u_dithering", 0); entityShader.uniform1f( "u_opacity", weather->fall.opaque ? t * t : t );