Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Визуальная часть ShaderESP 1.16.5

Начинающий
Начинающий
Статус
Онлайн
Регистрация
13 Май 2025
Сообщения
206
Реакции
1
Выберите загрузчик игры
  1. Vanilla
ShaderESPFunction:
Expand Collapse Copy
package ru.heaven.feature.functions.impl.render;

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldVertexBufferUploader;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.settings.PointOfView;
import net.minecraft.client.shader.Framebuffer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.util.math.MathHelper;
import org.lwjgl.opengl.GL11;
import ru.heaven.Heaven;
import ru.heaven.event.api.EventRegister;
import ru.heaven.event.impl.render.PostRender2DEvent;
import ru.heaven.event.impl.render.Render3DPosedEvent;
import ru.heaven.feature.functions.api.Function;
import ru.heaven.feature.functions.api.FunctionRegister;
import ru.heaven.feature.functions.api.settings.BooleanSettings;
import ru.heaven.feature.functions.api.settings.ColorSettings;
import ru.heaven.feature.functions.api.settings.ModeListSettings;
import ru.heaven.feature.functions.api.settings.ModeSettings;
import ru.heaven.feature.functions.api.settings.SliderSettings;
import ru.heaven.feature.functions.impl.Category;
import ru.heaven.util.clr.ColorUtils;
import ru.heaven.util.config.frined.FriendUtility;
import ru.heaven.util.render.RenderUtils;
import ru.heaven.util.render.shader.Sahder;
import ru.heaven.util.render.shader.ShaderManager;

import java.awt.Color;

@FunctionRegister(name = "Shader ESP", desc = "Подсвечивает сущности шейдером", category = Category.RENDER)
public class ShaderESPFunction extends Function {

    public static boolean renderingEntityMask;

    private static final String THEME = "Тема";
    private static final String CUSTOM = "Свой";
    private static final float MAX_DISTANCE = 128.0F;

    private final ModeListSettings selectEntities = new ModeListSettings("Применять на", "Игроков", "Мобов", "Предметы", "Себя и друзей");
    private final BooleanSettings drawOutline = new BooleanSettings("Обводка", true);
    private final BooleanSettings drawShadow = new BooleanSettings("Свечение", true);
    private final BooleanSettings fillModel = new BooleanSettings("Заполнять модель", true);
    private final ModeSettings colorMode = new ModeSettings("Режим цвета", THEME, CUSTOM);
    private final ColorSettings color = new ColorSettings("Цвет", Color.WHITE.getRGB(), true);
    private final SliderSettings multDark = new SliderSettings("Mult Dark", 0.55F, 0.15F, 1.0F, 0.05F);
    private final SliderSettings outlineWidth = new SliderSettings("Толщина обводки", 2.0F, 1.0F, 5.0F, 0.5F);
    private final SliderSettings glow = new SliderSettings("Сила свечения", 6.0F, 3.0F, 10.0F, 1.0F);

    private Framebuffer entityBuffer;
    private Framebuffer blurBuffer;
    private Framebuffer effectBuffer;
    private Framebuffer maskBuffer;

    private float lastDistance = 1.0F;
    private boolean renderedThisFrame;

    public ShaderESPFunction() {
        selectEntities.setEnabled("Игроков", true);
        selectEntities.setEnabled("Мобов", true);
        selectEntities.setEnabled("Предметы", true);
        selectEntities.setEnabled("Себя и друзей", true);

        color.setVisible(() -> colorMode.is(CUSTOM));
        outlineWidth.setVisible(drawOutline::get);
        glow.setVisible(drawShadow::get);

        addSettings(selectEntities, drawOutline, drawShadow, fillModel, colorMode, color, multDark, outlineWidth, glow);
    }

    @Override
    public void onDisable() {
        renderedThisFrame = false;
        lastDistance = 1.0F;
        renderingEntityMask = false;
        releaseBuffers();
        super.onDisable();
    }

    @EventRegister
    public void onRender3DPosed(Render3DPosedEvent event) {
        if (mc.player == null || mc.world == null || (!drawShadow.get() && !drawOutline.get() && !fillModel.get())) {
            renderedThisFrame = false;
            return;
        }

        entityBuffer = ensureFramebuffer(entityBuffer, true);
        entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        entityBuffer.bindFramebuffer(false);

        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.enableDepthTest();
        RenderSystem.depthMask(true);
        GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);

        EntityRendererManager rendererManager = mc.getRenderManager();
        IRenderTypeBuffer.Impl bufferSource = mc.getRenderTypeBuffers().getBufferSource();

        float closestDistance = Float.MAX_VALUE;
        boolean found = false;

        renderingEntityMask = true;
        try {
            for (Entity entity : mc.world.getAllEntities()) {
                if (!isValidEntity(entity)) {
                    continue;
                }

                float distance = mc.player.getDistance(entity);
                if (distance > MAX_DISTANCE) {
                    continue;
                }

                double x = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosX, entity.getPosX()) - event.getCx();
                double y = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosY, entity.getPosY()) - event.getCy();
                double z = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosZ, entity.getPosZ()) - event.getCz();
                float yaw = MathHelper.lerp(event.getPartialTicks(), entity.prevRotationYaw, entity.rotationYaw);

                rendererManager.renderEntityStatic(entity, x, y, z, yaw, event.getPartialTicks(), event.getMatrix(), bufferSource, rendererManager.getPackedLight(entity, event.getPartialTicks()));

                closestDistance = Math.min(closestDistance, distance);
                found = true;
            }
        } finally {
            renderingEntityMask = false;
            bufferSource.finish();
        }

        entityBuffer.unbindFramebuffer();
        mc.getFramebuffer().bindFramebuffer(false);

        RenderSystem.disableBlend();

        renderedThisFrame = found;
        if (found) {
            lastDistance = Math.max(1.0F, closestDistance);
        }
    }

    @EventRegister
    public void onPostRender2D(PostRender2DEvent event) {
        if (!renderedThisFrame || entityBuffer == null) {
            return;
        }

        blurBuffer = ensureFramebuffer(blurBuffer, false);
        effectBuffer = ensureFramebuffer(effectBuffer, false);
        maskBuffer = ensureFramebuffer(maskBuffer, false);

        int baseColor = resolveBaseColor();
        int darkColor = ColorUtils.multDark(baseColor, (float) multDark.getValue());

        float distanceScale = (float) Math.min(1.0D, 10.0D / lastDistance);
        float finalGlow = (float) glow.getValue() * distanceScale;
        float finalOutline = (float) outlineWidth.getValue() * distanceScale;

        MainWindow window = event.getMainWindow();
        float screenWidth = window.getScaledWidth();
        float screenHeight = window.getScaledHeight();

        mc.getFramebuffer().bindFramebuffer(false);
        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.disableAlphaTest();

        if (drawShadow.get()) {
            blurMask(entityBuffer, effectBuffer, Math.max(finalGlow, 2.0F), screenWidth, screenHeight);
            drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        if (fillModel.get()) {
            drawGradientTexture(entityBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        if (drawOutline.get()) {
            blurMask(entityBuffer, effectBuffer, Math.max(finalOutline, 1.0F), screenWidth, screenHeight);
            drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        RenderSystem.enableAlphaTest();
        RenderSystem.disableBlend();

        entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        effectBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        mc.getFramebuffer().bindFramebuffer(true);

        renderedThisFrame = false;
    }

    private boolean isValidEntity(Entity entity) {
        if (entity instanceof AbstractClientPlayerEntity player) {
            boolean isSelf = player == mc.player;
            boolean isFriend = FriendUtility.isFriend(player);

            if (isSelf) {
                return selectEntities.get("Себя и друзей") && mc.gameSettings.getPointOfView() != PointOfView.FIRST_PERSON;
            }

            if (isFriend && selectEntities.get("Себя и друзей")) {
                return true;
            }

            return selectEntities.get("Игроков");
        }

        if (entity instanceof MobEntity) {
            return selectEntities.get("Мобов");
        }

        if (entity instanceof ItemEntity) {
            return selectEntities.get("Предметы");
        }

        return false;
    }

    private int resolveBaseColor() {
        if (colorMode.is(CUSTOM)) {
            return color.getColor();
        }

        Heaven heaven = Heaven.getInstance();
        if (heaven != null && heaven.getFunctionManager() != null) {
            ClickGuiFunction clickGui = heaven.getFunctionManager().getFunction(ClickGuiFunction.class);
            if (clickGui != null) {
                return clickGui.themeColor.getColor();
            }
        }

        return color.getColor();
    }

    private void blurMask(Framebuffer input, Framebuffer output, float radius, float width, float height) {
        copyMaskBuffer(input, width, height);

        blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        blurBuffer.bindFramebuffer(false);
        RenderUtils.drawShadow(input.func_242996_f(), input.func_242996_f(), radius, 1.0F, 0.0F, 0.0F, 0.0F, width, height);
        blurBuffer.unbindFramebuffer();

        output.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        output.bindFramebuffer(false);
        RenderUtils.drawShadow(blurBuffer.func_242996_f(), maskBuffer.func_242996_f(), radius, 0.0F, 1.0F, 0.0F, 0.0F, width, height);
        output.unbindFramebuffer();

        mc.getFramebuffer().bindFramebuffer(false);
    }

    private void copyMaskBuffer(Framebuffer input, float width, float height) {
        Sahder gradient = ShaderManager.shader("gradient.frag");

        maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        maskBuffer.bindFramebuffer(false);

        gradient.begin();
        gradient.setUniformF("location", 0.0F, 0.0F);
        gradient.setUniformF("rectSize", width, height);
        gradient.setUniform("tex", 0);
        gradient.setUniformF("color1", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color2", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color3", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color4", 1.0F, 1.0F, 1.0F, 1.0F);

        GlStateManager.bindTexture(input.func_242996_f());
        drawStandardQuads(width, height);
        gradient.end();

        GlStateManager.bindTexture(0);
        maskBuffer.unbindFramebuffer();
        mc.getFramebuffer().bindFramebuffer(false);
    }

    private void drawGradientTexture(int textureId, int color1, int color2, float width, float height) {
        Sahder gradient = ShaderManager.shader("gradient.frag");
        float[] c1 = ColorUtils.getRGBAf(color1);
        float[] c2 = ColorUtils.getRGBAf(color2);

        gradient.begin();
        gradient.setUniformF("location", 0.0F, 0.0F);
        gradient.setUniformF("rectSize", width, height);
        gradient.setUniform("tex", 0);
        gradient.setUniformF("color1", c1[0], c1[1], c1[2], c1[3]);
        gradient.setUniformF("color2", c2[0], c2[1], c2[2], c2[3]);
        gradient.setUniformF("color3", c1[0], c1[1], c1[2], c1[3]);
        gradient.setUniformF("color4", c2[0], c2[1], c2[2], c2[3]);

        GlStateManager.bindTexture(textureId);
        drawFlippedQuads(width, height);
        gradient.end();

        GlStateManager.bindTexture(0);
    }

    private void drawStandardQuads(float width, float height) {
        BufferBuilder buffer = Tessellator.getInstance().getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(0.0D, height, 0.0D).tex(0.0F, 1.0F).endVertex();
        buffer.pos(width, height, 0.0D).tex(1.0F, 1.0F).endVertex();
        buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 0.0F).endVertex();
        buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 0.0F).endVertex();
        buffer.finishDrawing();
        WorldVertexBufferUploader.draw(buffer);
    }

    private void drawFlippedQuads(float width, float height) {
        BufferBuilder buffer = Tessellator.getInstance().getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(0.0D, height, 0.0D).tex(0.0F, 0.0F).endVertex();
        buffer.pos(width, height, 0.0D).tex(1.0F, 0.0F).endVertex();
        buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 1.0F).endVertex();
        buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 1.0F).endVertex();
        buffer.finishDrawing();
        WorldVertexBufferUploader.draw(buffer);
    }

    private Framebuffer ensureFramebuffer(Framebuffer framebuffer, boolean useDepth) {
        int width = Math.max(1, mc.getMainWindow().getWidth());
        int height = Math.max(1, mc.getMainWindow().getHeight());
        if (framebuffer == null || framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height) {
            if (framebuffer != null) {
                framebuffer.deleteFramebuffer();
            }
            return new Framebuffer(width, height, useDepth, false);
        }
        return framebuffer;
    }

    private void releaseBuffers() {
        entityBuffer = releaseFramebuffer(entityBuffer);
        blurBuffer = releaseFramebuffer(blurBuffer);
        effectBuffer = releaseFramebuffer(effectBuffer);
        maskBuffer = releaseFramebuffer(maskBuffer);
    }

    private Framebuffer releaseFramebuffer(Framebuffer framebuffer) {
        if (framebuffer != null) {
            framebuffer.deleteFramebuffer();
        }
        return null;
    }
}
1776952311848.png

1776952354794.png



RenderUtils:
Expand Collapse Copy
    public static void drawShadow(int sampler1, int sampler2, float radius, float directionX, float directionY, float x, float y, float width, float height) {
        radius = Math.min(radius, 63);
        Sahder shader = ShaderManager.shader("shadow.frag");
        shader.begin();
        shader.setUniform("sampler1", 0);
        shader.setUniform("sampler2", 1);
        shader.setUniformF("texelSize", 1.0F / (float) mc.getMainWindow().getWidth(), 1.0F / (float) mc.getMainWindow().getHeight());
        shader.setUniformF("direction", directionX, directionY);
        shader.setUniformF("radius", radius);

        float[] kernel = new float[(int) radius + 1];
        float sigma = radius / 2.0F;
        for (int i = 0; i <= (int) radius; i++) {
            kernel[i] = BlurUtils.calculateGaussianValue(i, sigma);
        }
        shader.setUniformF("kernel", kernel);

        RenderSystem.activeTexture(33984);
        RenderSystem.bindTexture(sampler1);
        RenderSystem.activeTexture(33985);
        RenderSystem.bindTexture(sampler2);
        RenderSystem.activeTexture(33984);

        shader.drawQuads(x, y, width, height);
        shader.end();
    }
 

Вложения

ShaderESPFunction:
Expand Collapse Copy
package ru.heaven.feature.functions.impl.render;

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldVertexBufferUploader;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.settings.PointOfView;
import net.minecraft.client.shader.Framebuffer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.util.math.MathHelper;
import org.lwjgl.opengl.GL11;
import ru.heaven.Heaven;
import ru.heaven.event.api.EventRegister;
import ru.heaven.event.impl.render.PostRender2DEvent;
import ru.heaven.event.impl.render.Render3DPosedEvent;
import ru.heaven.feature.functions.api.Function;
import ru.heaven.feature.functions.api.FunctionRegister;
import ru.heaven.feature.functions.api.settings.BooleanSettings;
import ru.heaven.feature.functions.api.settings.ColorSettings;
import ru.heaven.feature.functions.api.settings.ModeListSettings;
import ru.heaven.feature.functions.api.settings.ModeSettings;
import ru.heaven.feature.functions.api.settings.SliderSettings;
import ru.heaven.feature.functions.impl.Category;
import ru.heaven.util.clr.ColorUtils;
import ru.heaven.util.config.frined.FriendUtility;
import ru.heaven.util.render.RenderUtils;
import ru.heaven.util.render.shader.Sahder;
import ru.heaven.util.render.shader.ShaderManager;

import java.awt.Color;

@FunctionRegister(name = "Shader ESP", desc = "Подсвечивает сущности шейдером", category = Category.RENDER)
public class ShaderESPFunction extends Function {

    public static boolean renderingEntityMask;

    private static final String THEME = "Тема";
    private static final String CUSTOM = "Свой";
    private static final float MAX_DISTANCE = 128.0F;

    private final ModeListSettings selectEntities = new ModeListSettings("Применять на", "Игроков", "Мобов", "Предметы", "Себя и друзей");
    private final BooleanSettings drawOutline = new BooleanSettings("Обводка", true);
    private final BooleanSettings drawShadow = new BooleanSettings("Свечение", true);
    private final BooleanSettings fillModel = new BooleanSettings("Заполнять модель", true);
    private final ModeSettings colorMode = new ModeSettings("Режим цвета", THEME, CUSTOM);
    private final ColorSettings color = new ColorSettings("Цвет", Color.WHITE.getRGB(), true);
    private final SliderSettings multDark = new SliderSettings("Mult Dark", 0.55F, 0.15F, 1.0F, 0.05F);
    private final SliderSettings outlineWidth = new SliderSettings("Толщина обводки", 2.0F, 1.0F, 5.0F, 0.5F);
    private final SliderSettings glow = new SliderSettings("Сила свечения", 6.0F, 3.0F, 10.0F, 1.0F);

    private Framebuffer entityBuffer;
    private Framebuffer blurBuffer;
    private Framebuffer effectBuffer;
    private Framebuffer maskBuffer;

    private float lastDistance = 1.0F;
    private boolean renderedThisFrame;

    public ShaderESPFunction() {
        selectEntities.setEnabled("Игроков", true);
        selectEntities.setEnabled("Мобов", true);
        selectEntities.setEnabled("Предметы", true);
        selectEntities.setEnabled("Себя и друзей", true);

        color.setVisible(() -> colorMode.is(CUSTOM));
        outlineWidth.setVisible(drawOutline::get);
        glow.setVisible(drawShadow::get);

        addSettings(selectEntities, drawOutline, drawShadow, fillModel, colorMode, color, multDark, outlineWidth, glow);
    }

    @Override
    public void onDisable() {
        renderedThisFrame = false;
        lastDistance = 1.0F;
        renderingEntityMask = false;
        releaseBuffers();
        super.onDisable();
    }

    @EventRegister
    public void onRender3DPosed(Render3DPosedEvent event) {
        if (mc.player == null || mc.world == null || (!drawShadow.get() && !drawOutline.get() && !fillModel.get())) {
            renderedThisFrame = false;
            return;
        }

        entityBuffer = ensureFramebuffer(entityBuffer, true);
        entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        entityBuffer.bindFramebuffer(false);

        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.enableDepthTest();
        RenderSystem.depthMask(true);
        GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);

        EntityRendererManager rendererManager = mc.getRenderManager();
        IRenderTypeBuffer.Impl bufferSource = mc.getRenderTypeBuffers().getBufferSource();

        float closestDistance = Float.MAX_VALUE;
        boolean found = false;

        renderingEntityMask = true;
        try {
            for (Entity entity : mc.world.getAllEntities()) {
                if (!isValidEntity(entity)) {
                    continue;
                }

                float distance = mc.player.getDistance(entity);
                if (distance > MAX_DISTANCE) {
                    continue;
                }

                double x = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosX, entity.getPosX()) - event.getCx();
                double y = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosY, entity.getPosY()) - event.getCy();
                double z = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosZ, entity.getPosZ()) - event.getCz();
                float yaw = MathHelper.lerp(event.getPartialTicks(), entity.prevRotationYaw, entity.rotationYaw);

                rendererManager.renderEntityStatic(entity, x, y, z, yaw, event.getPartialTicks(), event.getMatrix(), bufferSource, rendererManager.getPackedLight(entity, event.getPartialTicks()));

                closestDistance = Math.min(closestDistance, distance);
                found = true;
            }
        } finally {
            renderingEntityMask = false;
            bufferSource.finish();
        }

        entityBuffer.unbindFramebuffer();
        mc.getFramebuffer().bindFramebuffer(false);

        RenderSystem.disableBlend();

        renderedThisFrame = found;
        if (found) {
            lastDistance = Math.max(1.0F, closestDistance);
        }
    }

    @EventRegister
    public void onPostRender2D(PostRender2DEvent event) {
        if (!renderedThisFrame || entityBuffer == null) {
            return;
        }

        blurBuffer = ensureFramebuffer(blurBuffer, false);
        effectBuffer = ensureFramebuffer(effectBuffer, false);
        maskBuffer = ensureFramebuffer(maskBuffer, false);

        int baseColor = resolveBaseColor();
        int darkColor = ColorUtils.multDark(baseColor, (float) multDark.getValue());

        float distanceScale = (float) Math.min(1.0D, 10.0D / lastDistance);
        float finalGlow = (float) glow.getValue() * distanceScale;
        float finalOutline = (float) outlineWidth.getValue() * distanceScale;

        MainWindow window = event.getMainWindow();
        float screenWidth = window.getScaledWidth();
        float screenHeight = window.getScaledHeight();

        mc.getFramebuffer().bindFramebuffer(false);
        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.disableAlphaTest();

        if (drawShadow.get()) {
            blurMask(entityBuffer, effectBuffer, Math.max(finalGlow, 2.0F), screenWidth, screenHeight);
            drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        if (fillModel.get()) {
            drawGradientTexture(entityBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        if (drawOutline.get()) {
            blurMask(entityBuffer, effectBuffer, Math.max(finalOutline, 1.0F), screenWidth, screenHeight);
            drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        RenderSystem.enableAlphaTest();
        RenderSystem.disableBlend();

        entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        effectBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        mc.getFramebuffer().bindFramebuffer(true);

        renderedThisFrame = false;
    }

    private boolean isValidEntity(Entity entity) {
        if (entity instanceof AbstractClientPlayerEntity player) {
            boolean isSelf = player == mc.player;
            boolean isFriend = FriendUtility.isFriend(player);

            if (isSelf) {
                return selectEntities.get("Себя и друзей") && mc.gameSettings.getPointOfView() != PointOfView.FIRST_PERSON;
            }

            if (isFriend && selectEntities.get("Себя и друзей")) {
                return true;
            }

            return selectEntities.get("Игроков");
        }

        if (entity instanceof MobEntity) {
            return selectEntities.get("Мобов");
        }

        if (entity instanceof ItemEntity) {
            return selectEntities.get("Предметы");
        }

        return false;
    }

    private int resolveBaseColor() {
        if (colorMode.is(CUSTOM)) {
            return color.getColor();
        }

        Heaven heaven = Heaven.getInstance();
        if (heaven != null && heaven.getFunctionManager() != null) {
            ClickGuiFunction clickGui = heaven.getFunctionManager().getFunction(ClickGuiFunction.class);
            if (clickGui != null) {
                return clickGui.themeColor.getColor();
            }
        }

        return color.getColor();
    }

    private void blurMask(Framebuffer input, Framebuffer output, float radius, float width, float height) {
        copyMaskBuffer(input, width, height);

        blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        blurBuffer.bindFramebuffer(false);
        RenderUtils.drawShadow(input.func_242996_f(), input.func_242996_f(), radius, 1.0F, 0.0F, 0.0F, 0.0F, width, height);
        blurBuffer.unbindFramebuffer();

        output.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        output.bindFramebuffer(false);
        RenderUtils.drawShadow(blurBuffer.func_242996_f(), maskBuffer.func_242996_f(), radius, 0.0F, 1.0F, 0.0F, 0.0F, width, height);
        output.unbindFramebuffer();

        mc.getFramebuffer().bindFramebuffer(false);
    }

    private void copyMaskBuffer(Framebuffer input, float width, float height) {
        Sahder gradient = ShaderManager.shader("gradient.frag");

        maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        maskBuffer.bindFramebuffer(false);

        gradient.begin();
        gradient.setUniformF("location", 0.0F, 0.0F);
        gradient.setUniformF("rectSize", width, height);
        gradient.setUniform("tex", 0);
        gradient.setUniformF("color1", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color2", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color3", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color4", 1.0F, 1.0F, 1.0F, 1.0F);

        GlStateManager.bindTexture(input.func_242996_f());
        drawStandardQuads(width, height);
        gradient.end();

        GlStateManager.bindTexture(0);
        maskBuffer.unbindFramebuffer();
        mc.getFramebuffer().bindFramebuffer(false);
    }

    private void drawGradientTexture(int textureId, int color1, int color2, float width, float height) {
        Sahder gradient = ShaderManager.shader("gradient.frag");
        float[] c1 = ColorUtils.getRGBAf(color1);
        float[] c2 = ColorUtils.getRGBAf(color2);

        gradient.begin();
        gradient.setUniformF("location", 0.0F, 0.0F);
        gradient.setUniformF("rectSize", width, height);
        gradient.setUniform("tex", 0);
        gradient.setUniformF("color1", c1[0], c1[1], c1[2], c1[3]);
        gradient.setUniformF("color2", c2[0], c2[1], c2[2], c2[3]);
        gradient.setUniformF("color3", c1[0], c1[1], c1[2], c1[3]);
        gradient.setUniformF("color4", c2[0], c2[1], c2[2], c2[3]);

        GlStateManager.bindTexture(textureId);
        drawFlippedQuads(width, height);
        gradient.end();

        GlStateManager.bindTexture(0);
    }

    private void drawStandardQuads(float width, float height) {
        BufferBuilder buffer = Tessellator.getInstance().getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(0.0D, height, 0.0D).tex(0.0F, 1.0F).endVertex();
        buffer.pos(width, height, 0.0D).tex(1.0F, 1.0F).endVertex();
        buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 0.0F).endVertex();
        buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 0.0F).endVertex();
        buffer.finishDrawing();
        WorldVertexBufferUploader.draw(buffer);
    }

    private void drawFlippedQuads(float width, float height) {
        BufferBuilder buffer = Tessellator.getInstance().getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(0.0D, height, 0.0D).tex(0.0F, 0.0F).endVertex();
        buffer.pos(width, height, 0.0D).tex(1.0F, 0.0F).endVertex();
        buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 1.0F).endVertex();
        buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 1.0F).endVertex();
        buffer.finishDrawing();
        WorldVertexBufferUploader.draw(buffer);
    }

    private Framebuffer ensureFramebuffer(Framebuffer framebuffer, boolean useDepth) {
        int width = Math.max(1, mc.getMainWindow().getWidth());
        int height = Math.max(1, mc.getMainWindow().getHeight());
        if (framebuffer == null || framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height) {
            if (framebuffer != null) {
                framebuffer.deleteFramebuffer();
            }
            return new Framebuffer(width, height, useDepth, false);
        }
        return framebuffer;
    }

    private void releaseBuffers() {
        entityBuffer = releaseFramebuffer(entityBuffer);
        blurBuffer = releaseFramebuffer(blurBuffer);
        effectBuffer = releaseFramebuffer(effectBuffer);
        maskBuffer = releaseFramebuffer(maskBuffer);
    }

    private Framebuffer releaseFramebuffer(Framebuffer framebuffer) {
        if (framebuffer != null) {
            framebuffer.deleteFramebuffer();
        }
        return null;
    }
}
Посмотреть вложение 333998
Посмотреть вложение 333999


RenderUtils:
Expand Collapse Copy
    public static void drawShadow(int sampler1, int sampler2, float radius, float directionX, float directionY, float x, float y, float width, float height) {
        radius = Math.min(radius, 63);
        Sahder shader = ShaderManager.shader("shadow.frag");
        shader.begin();
        shader.setUniform("sampler1", 0);
        shader.setUniform("sampler2", 1);
        shader.setUniformF("texelSize", 1.0F / (float) mc.getMainWindow().getWidth(), 1.0F / (float) mc.getMainWindow().getHeight());
        shader.setUniformF("direction", directionX, directionY);
        shader.setUniformF("radius", radius);

        float[] kernel = new float[(int) radius + 1];
        float sigma = radius / 2.0F;
        for (int i = 0; i <= (int) radius; i++) {
            kernel[i] = BlurUtils.calculateGaussianValue(i, sigma);
        }
        shader.setUniformF("kernel", kernel);

        RenderSystem.activeTexture(33984);
        RenderSystem.bindTexture(sampler1);
        RenderSystem.activeTexture(33985);
        RenderSystem.bindTexture(sampler2);
        RenderSystem.activeTexture(33984);

        shader.drawQuads(x, y, width, height);
        shader.end();
    }
вроде норм но нахуя настолько синим делать мир, у меня глаза вытекли от количество синиго
 
ShaderESPFunction:
Expand Collapse Copy
package ru.heaven.feature.functions.impl.render;

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldVertexBufferUploader;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.settings.PointOfView;
import net.minecraft.client.shader.Framebuffer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.util.math.MathHelper;
import org.lwjgl.opengl.GL11;
import ru.heaven.Heaven;
import ru.heaven.event.api.EventRegister;
import ru.heaven.event.impl.render.PostRender2DEvent;
import ru.heaven.event.impl.render.Render3DPosedEvent;
import ru.heaven.feature.functions.api.Function;
import ru.heaven.feature.functions.api.FunctionRegister;
import ru.heaven.feature.functions.api.settings.BooleanSettings;
import ru.heaven.feature.functions.api.settings.ColorSettings;
import ru.heaven.feature.functions.api.settings.ModeListSettings;
import ru.heaven.feature.functions.api.settings.ModeSettings;
import ru.heaven.feature.functions.api.settings.SliderSettings;
import ru.heaven.feature.functions.impl.Category;
import ru.heaven.util.clr.ColorUtils;
import ru.heaven.util.config.frined.FriendUtility;
import ru.heaven.util.render.RenderUtils;
import ru.heaven.util.render.shader.Sahder;
import ru.heaven.util.render.shader.ShaderManager;

import java.awt.Color;

@FunctionRegister(name = "Shader ESP", desc = "Подсвечивает сущности шейдером", category = Category.RENDER)
public class ShaderESPFunction extends Function {

    public static boolean renderingEntityMask;

    private static final String THEME = "Тема";
    private static final String CUSTOM = "Свой";
    private static final float MAX_DISTANCE = 128.0F;

    private final ModeListSettings selectEntities = new ModeListSettings("Применять на", "Игроков", "Мобов", "Предметы", "Себя и друзей");
    private final BooleanSettings drawOutline = new BooleanSettings("Обводка", true);
    private final BooleanSettings drawShadow = new BooleanSettings("Свечение", true);
    private final BooleanSettings fillModel = new BooleanSettings("Заполнять модель", true);
    private final ModeSettings colorMode = new ModeSettings("Режим цвета", THEME, CUSTOM);
    private final ColorSettings color = new ColorSettings("Цвет", Color.WHITE.getRGB(), true);
    private final SliderSettings multDark = new SliderSettings("Mult Dark", 0.55F, 0.15F, 1.0F, 0.05F);
    private final SliderSettings outlineWidth = new SliderSettings("Толщина обводки", 2.0F, 1.0F, 5.0F, 0.5F);
    private final SliderSettings glow = new SliderSettings("Сила свечения", 6.0F, 3.0F, 10.0F, 1.0F);

    private Framebuffer entityBuffer;
    private Framebuffer blurBuffer;
    private Framebuffer effectBuffer;
    private Framebuffer maskBuffer;

    private float lastDistance = 1.0F;
    private boolean renderedThisFrame;

    public ShaderESPFunction() {
        selectEntities.setEnabled("Игроков", true);
        selectEntities.setEnabled("Мобов", true);
        selectEntities.setEnabled("Предметы", true);
        selectEntities.setEnabled("Себя и друзей", true);

        color.setVisible(() -> colorMode.is(CUSTOM));
        outlineWidth.setVisible(drawOutline::get);
        glow.setVisible(drawShadow::get);

        addSettings(selectEntities, drawOutline, drawShadow, fillModel, colorMode, color, multDark, outlineWidth, glow);
    }

    @Override
    public void onDisable() {
        renderedThisFrame = false;
        lastDistance = 1.0F;
        renderingEntityMask = false;
        releaseBuffers();
        super.onDisable();
    }

    @EventRegister
    public void onRender3DPosed(Render3DPosedEvent event) {
        if (mc.player == null || mc.world == null || (!drawShadow.get() && !drawOutline.get() && !fillModel.get())) {
            renderedThisFrame = false;
            return;
        }

        entityBuffer = ensureFramebuffer(entityBuffer, true);
        entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        entityBuffer.bindFramebuffer(false);

        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.enableDepthTest();
        RenderSystem.depthMask(true);
        GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);

        EntityRendererManager rendererManager = mc.getRenderManager();
        IRenderTypeBuffer.Impl bufferSource = mc.getRenderTypeBuffers().getBufferSource();

        float closestDistance = Float.MAX_VALUE;
        boolean found = false;

        renderingEntityMask = true;
        try {
            for (Entity entity : mc.world.getAllEntities()) {
                if (!isValidEntity(entity)) {
                    continue;
                }

                float distance = mc.player.getDistance(entity);
                if (distance > MAX_DISTANCE) {
                    continue;
                }

                double x = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosX, entity.getPosX()) - event.getCx();
                double y = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosY, entity.getPosY()) - event.getCy();
                double z = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosZ, entity.getPosZ()) - event.getCz();
                float yaw = MathHelper.lerp(event.getPartialTicks(), entity.prevRotationYaw, entity.rotationYaw);

                rendererManager.renderEntityStatic(entity, x, y, z, yaw, event.getPartialTicks(), event.getMatrix(), bufferSource, rendererManager.getPackedLight(entity, event.getPartialTicks()));

                closestDistance = Math.min(closestDistance, distance);
                found = true;
            }
        } finally {
            renderingEntityMask = false;
            bufferSource.finish();
        }

        entityBuffer.unbindFramebuffer();
        mc.getFramebuffer().bindFramebuffer(false);

        RenderSystem.disableBlend();

        renderedThisFrame = found;
        if (found) {
            lastDistance = Math.max(1.0F, closestDistance);
        }
    }

    @EventRegister
    public void onPostRender2D(PostRender2DEvent event) {
        if (!renderedThisFrame || entityBuffer == null) {
            return;
        }

        blurBuffer = ensureFramebuffer(blurBuffer, false);
        effectBuffer = ensureFramebuffer(effectBuffer, false);
        maskBuffer = ensureFramebuffer(maskBuffer, false);

        int baseColor = resolveBaseColor();
        int darkColor = ColorUtils.multDark(baseColor, (float) multDark.getValue());

        float distanceScale = (float) Math.min(1.0D, 10.0D / lastDistance);
        float finalGlow = (float) glow.getValue() * distanceScale;
        float finalOutline = (float) outlineWidth.getValue() * distanceScale;

        MainWindow window = event.getMainWindow();
        float screenWidth = window.getScaledWidth();
        float screenHeight = window.getScaledHeight();

        mc.getFramebuffer().bindFramebuffer(false);
        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.disableAlphaTest();

        if (drawShadow.get()) {
            blurMask(entityBuffer, effectBuffer, Math.max(finalGlow, 2.0F), screenWidth, screenHeight);
            drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        if (fillModel.get()) {
            drawGradientTexture(entityBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        if (drawOutline.get()) {
            blurMask(entityBuffer, effectBuffer, Math.max(finalOutline, 1.0F), screenWidth, screenHeight);
            drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        RenderSystem.enableAlphaTest();
        RenderSystem.disableBlend();

        entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        effectBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        mc.getFramebuffer().bindFramebuffer(true);

        renderedThisFrame = false;
    }

    private boolean isValidEntity(Entity entity) {
        if (entity instanceof AbstractClientPlayerEntity player) {
            boolean isSelf = player == mc.player;
            boolean isFriend = FriendUtility.isFriend(player);

            if (isSelf) {
                return selectEntities.get("Себя и друзей") && mc.gameSettings.getPointOfView() != PointOfView.FIRST_PERSON;
            }

            if (isFriend && selectEntities.get("Себя и друзей")) {
                return true;
            }

            return selectEntities.get("Игроков");
        }

        if (entity instanceof MobEntity) {
            return selectEntities.get("Мобов");
        }

        if (entity instanceof ItemEntity) {
            return selectEntities.get("Предметы");
        }

        return false;
    }

    private int resolveBaseColor() {
        if (colorMode.is(CUSTOM)) {
            return color.getColor();
        }

        Heaven heaven = Heaven.getInstance();
        if (heaven != null && heaven.getFunctionManager() != null) {
            ClickGuiFunction clickGui = heaven.getFunctionManager().getFunction(ClickGuiFunction.class);
            if (clickGui != null) {
                return clickGui.themeColor.getColor();
            }
        }

        return color.getColor();
    }

    private void blurMask(Framebuffer input, Framebuffer output, float radius, float width, float height) {
        copyMaskBuffer(input, width, height);

        blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        blurBuffer.bindFramebuffer(false);
        RenderUtils.drawShadow(input.func_242996_f(), input.func_242996_f(), radius, 1.0F, 0.0F, 0.0F, 0.0F, width, height);
        blurBuffer.unbindFramebuffer();

        output.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        output.bindFramebuffer(false);
        RenderUtils.drawShadow(blurBuffer.func_242996_f(), maskBuffer.func_242996_f(), radius, 0.0F, 1.0F, 0.0F, 0.0F, width, height);
        output.unbindFramebuffer();

        mc.getFramebuffer().bindFramebuffer(false);
    }

    private void copyMaskBuffer(Framebuffer input, float width, float height) {
        Sahder gradient = ShaderManager.shader("gradient.frag");

        maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        maskBuffer.bindFramebuffer(false);

        gradient.begin();
        gradient.setUniformF("location", 0.0F, 0.0F);
        gradient.setUniformF("rectSize", width, height);
        gradient.setUniform("tex", 0);
        gradient.setUniformF("color1", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color2", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color3", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color4", 1.0F, 1.0F, 1.0F, 1.0F);

        GlStateManager.bindTexture(input.func_242996_f());
        drawStandardQuads(width, height);
        gradient.end();

        GlStateManager.bindTexture(0);
        maskBuffer.unbindFramebuffer();
        mc.getFramebuffer().bindFramebuffer(false);
    }

    private void drawGradientTexture(int textureId, int color1, int color2, float width, float height) {
        Sahder gradient = ShaderManager.shader("gradient.frag");
        float[] c1 = ColorUtils.getRGBAf(color1);
        float[] c2 = ColorUtils.getRGBAf(color2);

        gradient.begin();
        gradient.setUniformF("location", 0.0F, 0.0F);
        gradient.setUniformF("rectSize", width, height);
        gradient.setUniform("tex", 0);
        gradient.setUniformF("color1", c1[0], c1[1], c1[2], c1[3]);
        gradient.setUniformF("color2", c2[0], c2[1], c2[2], c2[3]);
        gradient.setUniformF("color3", c1[0], c1[1], c1[2], c1[3]);
        gradient.setUniformF("color4", c2[0], c2[1], c2[2], c2[3]);

        GlStateManager.bindTexture(textureId);
        drawFlippedQuads(width, height);
        gradient.end();

        GlStateManager.bindTexture(0);
    }

    private void drawStandardQuads(float width, float height) {
        BufferBuilder buffer = Tessellator.getInstance().getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(0.0D, height, 0.0D).tex(0.0F, 1.0F).endVertex();
        buffer.pos(width, height, 0.0D).tex(1.0F, 1.0F).endVertex();
        buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 0.0F).endVertex();
        buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 0.0F).endVertex();
        buffer.finishDrawing();
        WorldVertexBufferUploader.draw(buffer);
    }

    private void drawFlippedQuads(float width, float height) {
        BufferBuilder buffer = Tessellator.getInstance().getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(0.0D, height, 0.0D).tex(0.0F, 0.0F).endVertex();
        buffer.pos(width, height, 0.0D).tex(1.0F, 0.0F).endVertex();
        buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 1.0F).endVertex();
        buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 1.0F).endVertex();
        buffer.finishDrawing();
        WorldVertexBufferUploader.draw(buffer);
    }

    private Framebuffer ensureFramebuffer(Framebuffer framebuffer, boolean useDepth) {
        int width = Math.max(1, mc.getMainWindow().getWidth());
        int height = Math.max(1, mc.getMainWindow().getHeight());
        if (framebuffer == null || framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height) {
            if (framebuffer != null) {
                framebuffer.deleteFramebuffer();
            }
            return new Framebuffer(width, height, useDepth, false);
        }
        return framebuffer;
    }

    private void releaseBuffers() {
        entityBuffer = releaseFramebuffer(entityBuffer);
        blurBuffer = releaseFramebuffer(blurBuffer);
        effectBuffer = releaseFramebuffer(effectBuffer);
        maskBuffer = releaseFramebuffer(maskBuffer);
    }

    private Framebuffer releaseFramebuffer(Framebuffer framebuffer) {
        if (framebuffer != null) {
            framebuffer.deleteFramebuffer();
        }
        return null;
    }
}
Посмотреть вложение 333998
Посмотреть вложение 333999


RenderUtils:
Expand Collapse Copy
    public static void drawShadow(int sampler1, int sampler2, float radius, float directionX, float directionY, float x, float y, float width, float height) {
        radius = Math.min(radius, 63);
        Sahder shader = ShaderManager.shader("shadow.frag");
        shader.begin();
        shader.setUniform("sampler1", 0);
        shader.setUniform("sampler2", 1);
        shader.setUniformF("texelSize", 1.0F / (float) mc.getMainWindow().getWidth(), 1.0F / (float) mc.getMainWindow().getHeight());
        shader.setUniformF("direction", directionX, directionY);
        shader.setUniformF("radius", radius);

        float[] kernel = new float[(int) radius + 1];
        float sigma = radius / 2.0F;
        for (int i = 0; i <= (int) radius; i++) {
            kernel[i] = BlurUtils.calculateGaussianValue(i, sigma);
        }
        shader.setUniformF("kernel", kernel);

        RenderSystem.activeTexture(33984);
        RenderSystem.bindTexture(sampler1);
        RenderSystem.activeTexture(33985);
        RenderSystem.bindTexture(sampler2);
        RenderSystem.activeTexture(33984);

        shader.drawQuads(x, y, width, height);
        shader.end();
    }
норм ап
 
ShaderESPFunction:
Expand Collapse Copy
package ru.heaven.feature.functions.impl.render;

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldVertexBufferUploader;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.settings.PointOfView;
import net.minecraft.client.shader.Framebuffer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.util.math.MathHelper;
import org.lwjgl.opengl.GL11;
import ru.heaven.Heaven;
import ru.heaven.event.api.EventRegister;
import ru.heaven.event.impl.render.PostRender2DEvent;
import ru.heaven.event.impl.render.Render3DPosedEvent;
import ru.heaven.feature.functions.api.Function;
import ru.heaven.feature.functions.api.FunctionRegister;
import ru.heaven.feature.functions.api.settings.BooleanSettings;
import ru.heaven.feature.functions.api.settings.ColorSettings;
import ru.heaven.feature.functions.api.settings.ModeListSettings;
import ru.heaven.feature.functions.api.settings.ModeSettings;
import ru.heaven.feature.functions.api.settings.SliderSettings;
import ru.heaven.feature.functions.impl.Category;
import ru.heaven.util.clr.ColorUtils;
import ru.heaven.util.config.frined.FriendUtility;
import ru.heaven.util.render.RenderUtils;
import ru.heaven.util.render.shader.Sahder;
import ru.heaven.util.render.shader.ShaderManager;

import java.awt.Color;

@FunctionRegister(name = "Shader ESP", desc = "Подсвечивает сущности шейдером", category = Category.RENDER)
public class ShaderESPFunction extends Function {

    public static boolean renderingEntityMask;

    private static final String THEME = "Тема";
    private static final String CUSTOM = "Свой";
    private static final float MAX_DISTANCE = 128.0F;

    private final ModeListSettings selectEntities = new ModeListSettings("Применять на", "Игроков", "Мобов", "Предметы", "Себя и друзей");
    private final BooleanSettings drawOutline = new BooleanSettings("Обводка", true);
    private final BooleanSettings drawShadow = new BooleanSettings("Свечение", true);
    private final BooleanSettings fillModel = new BooleanSettings("Заполнять модель", true);
    private final ModeSettings colorMode = new ModeSettings("Режим цвета", THEME, CUSTOM);
    private final ColorSettings color = new ColorSettings("Цвет", Color.WHITE.getRGB(), true);
    private final SliderSettings multDark = new SliderSettings("Mult Dark", 0.55F, 0.15F, 1.0F, 0.05F);
    private final SliderSettings outlineWidth = new SliderSettings("Толщина обводки", 2.0F, 1.0F, 5.0F, 0.5F);
    private final SliderSettings glow = new SliderSettings("Сила свечения", 6.0F, 3.0F, 10.0F, 1.0F);

    private Framebuffer entityBuffer;
    private Framebuffer blurBuffer;
    private Framebuffer effectBuffer;
    private Framebuffer maskBuffer;

    private float lastDistance = 1.0F;
    private boolean renderedThisFrame;

    public ShaderESPFunction() {
        selectEntities.setEnabled("Игроков", true);
        selectEntities.setEnabled("Мобов", true);
        selectEntities.setEnabled("Предметы", true);
        selectEntities.setEnabled("Себя и друзей", true);

        color.setVisible(() -> colorMode.is(CUSTOM));
        outlineWidth.setVisible(drawOutline::get);
        glow.setVisible(drawShadow::get);

        addSettings(selectEntities, drawOutline, drawShadow, fillModel, colorMode, color, multDark, outlineWidth, glow);
    }

    @Override
    public void onDisable() {
        renderedThisFrame = false;
        lastDistance = 1.0F;
        renderingEntityMask = false;
        releaseBuffers();
        super.onDisable();
    }

    @EventRegister
    public void onRender3DPosed(Render3DPosedEvent event) {
        if (mc.player == null || mc.world == null || (!drawShadow.get() && !drawOutline.get() && !fillModel.get())) {
            renderedThisFrame = false;
            return;
        }

        entityBuffer = ensureFramebuffer(entityBuffer, true);
        entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        entityBuffer.bindFramebuffer(false);

        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.enableDepthTest();
        RenderSystem.depthMask(true);
        GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);

        EntityRendererManager rendererManager = mc.getRenderManager();
        IRenderTypeBuffer.Impl bufferSource = mc.getRenderTypeBuffers().getBufferSource();

        float closestDistance = Float.MAX_VALUE;
        boolean found = false;

        renderingEntityMask = true;
        try {
            for (Entity entity : mc.world.getAllEntities()) {
                if (!isValidEntity(entity)) {
                    continue;
                }

                float distance = mc.player.getDistance(entity);
                if (distance > MAX_DISTANCE) {
                    continue;
                }

                double x = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosX, entity.getPosX()) - event.getCx();
                double y = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosY, entity.getPosY()) - event.getCy();
                double z = MathHelper.lerp(event.getPartialTicks(), entity.lastTickPosZ, entity.getPosZ()) - event.getCz();
                float yaw = MathHelper.lerp(event.getPartialTicks(), entity.prevRotationYaw, entity.rotationYaw);

                rendererManager.renderEntityStatic(entity, x, y, z, yaw, event.getPartialTicks(), event.getMatrix(), bufferSource, rendererManager.getPackedLight(entity, event.getPartialTicks()));

                closestDistance = Math.min(closestDistance, distance);
                found = true;
            }
        } finally {
            renderingEntityMask = false;
            bufferSource.finish();
        }

        entityBuffer.unbindFramebuffer();
        mc.getFramebuffer().bindFramebuffer(false);

        RenderSystem.disableBlend();

        renderedThisFrame = found;
        if (found) {
            lastDistance = Math.max(1.0F, closestDistance);
        }
    }

    @EventRegister
    public void onPostRender2D(PostRender2DEvent event) {
        if (!renderedThisFrame || entityBuffer == null) {
            return;
        }

        blurBuffer = ensureFramebuffer(blurBuffer, false);
        effectBuffer = ensureFramebuffer(effectBuffer, false);
        maskBuffer = ensureFramebuffer(maskBuffer, false);

        int baseColor = resolveBaseColor();
        int darkColor = ColorUtils.multDark(baseColor, (float) multDark.getValue());

        float distanceScale = (float) Math.min(1.0D, 10.0D / lastDistance);
        float finalGlow = (float) glow.getValue() * distanceScale;
        float finalOutline = (float) outlineWidth.getValue() * distanceScale;

        MainWindow window = event.getMainWindow();
        float screenWidth = window.getScaledWidth();
        float screenHeight = window.getScaledHeight();

        mc.getFramebuffer().bindFramebuffer(false);
        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.disableAlphaTest();

        if (drawShadow.get()) {
            blurMask(entityBuffer, effectBuffer, Math.max(finalGlow, 2.0F), screenWidth, screenHeight);
            drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        if (fillModel.get()) {
            drawGradientTexture(entityBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        if (drawOutline.get()) {
            blurMask(entityBuffer, effectBuffer, Math.max(finalOutline, 1.0F), screenWidth, screenHeight);
            drawGradientTexture(effectBuffer.func_242996_f(), baseColor, darkColor, screenWidth, screenHeight);
        }

        RenderSystem.enableAlphaTest();
        RenderSystem.disableBlend();

        entityBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        effectBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        mc.getFramebuffer().bindFramebuffer(true);

        renderedThisFrame = false;
    }

    private boolean isValidEntity(Entity entity) {
        if (entity instanceof AbstractClientPlayerEntity player) {
            boolean isSelf = player == mc.player;
            boolean isFriend = FriendUtility.isFriend(player);

            if (isSelf) {
                return selectEntities.get("Себя и друзей") && mc.gameSettings.getPointOfView() != PointOfView.FIRST_PERSON;
            }

            if (isFriend && selectEntities.get("Себя и друзей")) {
                return true;
            }

            return selectEntities.get("Игроков");
        }

        if (entity instanceof MobEntity) {
            return selectEntities.get("Мобов");
        }

        if (entity instanceof ItemEntity) {
            return selectEntities.get("Предметы");
        }

        return false;
    }

    private int resolveBaseColor() {
        if (colorMode.is(CUSTOM)) {
            return color.getColor();
        }

        Heaven heaven = Heaven.getInstance();
        if (heaven != null && heaven.getFunctionManager() != null) {
            ClickGuiFunction clickGui = heaven.getFunctionManager().getFunction(ClickGuiFunction.class);
            if (clickGui != null) {
                return clickGui.themeColor.getColor();
            }
        }

        return color.getColor();
    }

    private void blurMask(Framebuffer input, Framebuffer output, float radius, float width, float height) {
        copyMaskBuffer(input, width, height);

        blurBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        blurBuffer.bindFramebuffer(false);
        RenderUtils.drawShadow(input.func_242996_f(), input.func_242996_f(), radius, 1.0F, 0.0F, 0.0F, 0.0F, width, height);
        blurBuffer.unbindFramebuffer();

        output.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        output.bindFramebuffer(false);
        RenderUtils.drawShadow(blurBuffer.func_242996_f(), maskBuffer.func_242996_f(), radius, 0.0F, 1.0F, 0.0F, 0.0F, width, height);
        output.unbindFramebuffer();

        mc.getFramebuffer().bindFramebuffer(false);
    }

    private void copyMaskBuffer(Framebuffer input, float width, float height) {
        Sahder gradient = ShaderManager.shader("gradient.frag");

        maskBuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        maskBuffer.bindFramebuffer(false);

        gradient.begin();
        gradient.setUniformF("location", 0.0F, 0.0F);
        gradient.setUniformF("rectSize", width, height);
        gradient.setUniform("tex", 0);
        gradient.setUniformF("color1", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color2", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color3", 1.0F, 1.0F, 1.0F, 1.0F);
        gradient.setUniformF("color4", 1.0F, 1.0F, 1.0F, 1.0F);

        GlStateManager.bindTexture(input.func_242996_f());
        drawStandardQuads(width, height);
        gradient.end();

        GlStateManager.bindTexture(0);
        maskBuffer.unbindFramebuffer();
        mc.getFramebuffer().bindFramebuffer(false);
    }

    private void drawGradientTexture(int textureId, int color1, int color2, float width, float height) {
        Sahder gradient = ShaderManager.shader("gradient.frag");
        float[] c1 = ColorUtils.getRGBAf(color1);
        float[] c2 = ColorUtils.getRGBAf(color2);

        gradient.begin();
        gradient.setUniformF("location", 0.0F, 0.0F);
        gradient.setUniformF("rectSize", width, height);
        gradient.setUniform("tex", 0);
        gradient.setUniformF("color1", c1[0], c1[1], c1[2], c1[3]);
        gradient.setUniformF("color2", c2[0], c2[1], c2[2], c2[3]);
        gradient.setUniformF("color3", c1[0], c1[1], c1[2], c1[3]);
        gradient.setUniformF("color4", c2[0], c2[1], c2[2], c2[3]);

        GlStateManager.bindTexture(textureId);
        drawFlippedQuads(width, height);
        gradient.end();

        GlStateManager.bindTexture(0);
    }

    private void drawStandardQuads(float width, float height) {
        BufferBuilder buffer = Tessellator.getInstance().getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(0.0D, height, 0.0D).tex(0.0F, 1.0F).endVertex();
        buffer.pos(width, height, 0.0D).tex(1.0F, 1.0F).endVertex();
        buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 0.0F).endVertex();
        buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 0.0F).endVertex();
        buffer.finishDrawing();
        WorldVertexBufferUploader.draw(buffer);
    }

    private void drawFlippedQuads(float width, float height) {
        BufferBuilder buffer = Tessellator.getInstance().getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(0.0D, height, 0.0D).tex(0.0F, 0.0F).endVertex();
        buffer.pos(width, height, 0.0D).tex(1.0F, 0.0F).endVertex();
        buffer.pos(width, 0.0D, 0.0D).tex(1.0F, 1.0F).endVertex();
        buffer.pos(0.0D, 0.0D, 0.0D).tex(0.0F, 1.0F).endVertex();
        buffer.finishDrawing();
        WorldVertexBufferUploader.draw(buffer);
    }

    private Framebuffer ensureFramebuffer(Framebuffer framebuffer, boolean useDepth) {
        int width = Math.max(1, mc.getMainWindow().getWidth());
        int height = Math.max(1, mc.getMainWindow().getHeight());
        if (framebuffer == null || framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height) {
            if (framebuffer != null) {
                framebuffer.deleteFramebuffer();
            }
            return new Framebuffer(width, height, useDepth, false);
        }
        return framebuffer;
    }

    private void releaseBuffers() {
        entityBuffer = releaseFramebuffer(entityBuffer);
        blurBuffer = releaseFramebuffer(blurBuffer);
        effectBuffer = releaseFramebuffer(effectBuffer);
        maskBuffer = releaseFramebuffer(maskBuffer);
    }

    private Framebuffer releaseFramebuffer(Framebuffer framebuffer) {
        if (framebuffer != null) {
            framebuffer.deleteFramebuffer();
        }
        return null;
    }
}
Посмотреть вложение 333998
Посмотреть вложение 333999


RenderUtils:
Expand Collapse Copy
    public static void drawShadow(int sampler1, int sampler2, float radius, float directionX, float directionY, float x, float y, float width, float height) {
        radius = Math.min(radius, 63);
        Sahder shader = ShaderManager.shader("shadow.frag");
        shader.begin();
        shader.setUniform("sampler1", 0);
        shader.setUniform("sampler2", 1);
        shader.setUniformF("texelSize", 1.0F / (float) mc.getMainWindow().getWidth(), 1.0F / (float) mc.getMainWindow().getHeight());
        shader.setUniformF("direction", directionX, directionY);
        shader.setUniformF("radius", radius);

        float[] kernel = new float[(int) radius + 1];
        float sigma = radius / 2.0F;
        for (int i = 0; i <= (int) radius; i++) {
            kernel[i] = BlurUtils.calculateGaussianValue(i, sigma);
        }
        shader.setUniformF("kernel", kernel);

        RenderSystem.activeTexture(33984);
        RenderSystem.bindTexture(sampler1);
        RenderSystem.activeTexture(33985);
        RenderSystem.bindTexture(sampler2);
        RenderSystem.activeTexture(33984);

        shader.drawQuads(x, y, width, height);
        shader.end();
    }
прикольно
 
дай cx cy cz в рендер3д евенте, еще ColorUtils.getrgbaf, и блюрутилс пж
Render3DPosedEvent:
Expand Collapse Copy
package ru.heaven.event.impl.render;

import com.mojang.blaze3d.matrix.MatrixStack;
import lombok.AllArgsConstructor;
import lombok.Getter;
import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.util.math.vector.Matrix4f;
import ru.heaven.event.api.Event;

/**
 * @author chuppachups8368
 * @since 21.04.2026
 */

@Getter
@AllArgsConstructor
public final class Render3DPosedEvent extends Event {
    private final MatrixStack matrix;
    private final Matrix4f projectionMatrix;
    private final ActiveRenderInfo activeRenderInfo;
    private final WorldRenderer context;
    private final float partialTicks;
    private final long finishTimeNano;
    private double cx, cy, cz;
}


WorldRenderer:
Expand Collapse Copy
    public void updateCameraAndRender(MatrixStack matrixStackIn, float partialTicks, long finishTimeNano, boolean drawBlockOutline, ActiveRenderInfo activeRenderInfoIn, GameRenderer gameRendererIn, LightTexture lightmapIn, Matrix4f projectionIn)
    {
        TileEntityRendererDispatcher.instance.prepare(this.world, this.mc.getTextureManager(), this.mc.fontRenderer, activeRenderInfoIn, this.mc.objectMouseOver);
        this.renderManager.cacheActiveRenderInfo(this.world, activeRenderInfoIn, this.mc.pointedEntity);
        IProfiler iprofiler = this.world.getProfiler();
        iprofiler.endStartSection("light_updates");
        this.mc.world.getChunkProvider().getLightManager().tick(Integer.MAX_VALUE, true, true);
        Vector3d vector3d = activeRenderInfoIn.getProjectedView();
        double d0 = vector3d.getX();
        double d1 = vector3d.getY();
        double d2 = vector3d.getZ();
        Matrix4f matrix4f = matrixStackIn.getLast().getMatrix();
        iprofiler.endStartSection("culling");
        boolean flag = this.debugFixedClippingHelper != null;
        ClippingHelper clippinghelper;

        if (flag)
        {
            clippinghelper = this.debugFixedClippingHelper;
            clippinghelper.setCameraPosition(this.debugTerrainFrustumPosition.x, this.debugTerrainFrustumPosition.y, this.debugTerrainFrustumPosition.z);
        }
        else
        {
            clippinghelper = new ClippingHelper(matrix4f, projectionIn);
            clippinghelper.setCameraPosition(d0, d1, d2);
        }

        this.mc.getProfiler().endStartSection("captureFrustum");

        if (this.debugFixTerrainFrustum)
        {
            this.captureFrustum(matrix4f, projectionIn, vector3d.x, vector3d.y, vector3d.z, flag ? new ClippingHelper(matrix4f, projectionIn) : clippinghelper);
            this.debugFixTerrainFrustum = false;
        }

        iprofiler.endStartSection("clear");

        if (Config.isShaders())
        {
            Shaders.setViewport(0, 0, this.mc.getMainWindow().getFramebufferWidth(), this.mc.getMainWindow().getFramebufferHeight());
        }
        else
        {
            RenderSystem.viewport(0, 0, this.mc.getMainWindow().getFramebufferWidth(), this.mc.getMainWindow().getFramebufferHeight());
        }

        FogRenderer.updateFogColor(activeRenderInfoIn, partialTicks, this.mc.world, this.mc.gameSettings.renderDistanceChunks, gameRendererIn.getBossColorModifier(partialTicks));
        RenderSystem.clear(16640, Minecraft.IS_RUNNING_ON_MAC);
        boolean flag1 = Config.isShaders();

        if (flag1)
        {
            Shaders.clearRenderBuffer();
            Shaders.setCamera(matrixStackIn, activeRenderInfoIn, partialTicks);
            Shaders.renderPrepare();
        }

        clippinghelper.disabled = Config.isShaders() && !Shaders.isFrustumCulling();
        float f = gameRendererIn.getFarPlaneDistance();
        boolean flag2 = this.mc.world.func_239132_a_().func_230493_a_(MathHelper.floor(d0), MathHelper.floor(d1)) || this.mc.ingameGUI.getBossOverlay().shouldCreateFog();

        if ((Config.isSkyEnabled() || Config.isSunMoonEnabled() || Config.isStarsEnabled()) && !Shaders.isShadowPass)
        {
            FogRenderer.setupFog(activeRenderInfoIn, FogRenderer.FogType.FOG_SKY, f, flag2, partialTicks);
            iprofiler.endStartSection("sky");

            if (flag1)
            {
                Shaders.beginSky();
            }

            this.renderSky(matrixStackIn, partialTicks);

            if (flag1)
            {
                Shaders.endSky();
            }
        }
        else
        {
            GlStateManager.disableBlend();
        }

        iprofiler.endStartSection("fog");
        FogRenderer.setupFog(activeRenderInfoIn, FogRenderer.FogType.FOG_TERRAIN, Math.max(f - 16.0F, 32.0F), flag2, partialTicks);
        iprofiler.endStartSection("terrain_setup");
        this.checkLoadVisibleChunks(activeRenderInfoIn, clippinghelper, this.mc.player.isSpectator());
        this.setupTerrain(activeRenderInfoIn, clippinghelper, flag, this.frameId++, this.mc.player.isSpectator());
        iprofiler.endStartSection("updatechunks");
        int i = 30;
        int j = this.mc.gameSettings.framerateLimit;
        long k = 33333333L;
        long l;

        if ((double)j == AbstractOption.FRAMERATE_LIMIT.getMaxValue())
        {
            l = 0L;
        }
        else
        {
            l = (long)(1000000000 / j);
        }

        long i1 = Util.nanoTime() - finishTimeNano;
        long j1 = this.renderTimeManager.nextValue(i1);
        long k1 = j1 * 3L / 2L;
        long l1 = MathHelper.clamp(k1, l, 33333333L);
        Lagometer.timerChunkUpload.start();
        this.updateChunks(finishTimeNano + l1);
        Lagometer.timerChunkUpload.end();
        iprofiler.endStartSection("terrain");
        Lagometer.timerTerrain.start();

        if (this.mc.gameSettings.ofSmoothFps)
        {
            this.mc.getProfiler().endStartSection("finish");
            GL11.glFinish();
            this.mc.getProfiler().endStartSection("terrain");
        }

        if (Config.isFogOff() && FogRenderer.fogStandard)
        {
            GlStateManager.setFogAllowed(false);
        }

        this.renderBlockLayer(RenderType.getSolid(), matrixStackIn, d0, d1, d2);
        this.mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).setBlurMipmapDirect(false, this.mc.gameSettings.mipmapLevels > 0);
        this.renderBlockLayer(RenderType.getCutoutMipped(), matrixStackIn, d0, d1, d2);
        this.mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).restoreLastBlurMipmap();
        this.renderBlockLayer(RenderType.getCutout(), matrixStackIn, d0, d1, d2);

        if (flag1)
        {
            ShadersRender.endTerrain();
        }

        Lagometer.timerTerrain.end();

        if (this.world.func_239132_a_().func_239217_c_())
        {
            RenderHelper.setupDiffuseGuiLighting(matrixStackIn.getLast().getMatrix());
        }
        else
        {
            RenderHelper.setupLevelDiffuseLighting(matrixStackIn.getLast().getMatrix());
        }

        if (flag1)
        {
            Shaders.beginEntities();
        }

        ItemFrameRenderer.updateItemRenderDistance();
        iprofiler.endStartSection("entities");
        ++renderEntitiesCounter;
        this.countEntitiesRendered = 0;
        this.countEntitiesHidden = 0;
        this.countTileEntitiesRendered = 0;

        if (this.field_239223_G_ != null)
        {
            this.field_239223_G_.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
            this.field_239223_G_.func_237506_a_(this.mc.getFramebuffer());
            this.mc.getFramebuffer().bindFramebuffer(false);
        }

        if (this.field_239225_I_ != null)
        {
            this.field_239225_I_.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        }

        if (this.isRenderEntityOutlines())
        {
            this.entityOutlineFramebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
            this.mc.getFramebuffer().bindFramebuffer(false);
        }

        boolean flag3 = false;
        IRenderTypeBuffer.Impl irendertypebuffer$impl = this.renderTypeTextures.getBufferSource();

        if (Config.isFastRender())
        {
            RenderStateManager.enableCache();
        }

        for (WorldRenderer.LocalRenderInformationContainer worldrenderer$localrenderinformationcontainer : this.renderInfosEntities)
        {
            ChunkRenderDispatcher.ChunkRender chunkrenderdispatcher$chunkrender = worldrenderer$localrenderinformationcontainer.renderChunk;
            Chunk chunk = chunkrenderdispatcher$chunkrender.getChunk();

            for (Entity entity : chunk.getEntityLists()[chunkrenderdispatcher$chunkrender.getPosition().getY() / 16])
            {
                boolean flag4 = entity == this.mc.player && !this.mc.player.isSpectator();

                if ((this.renderManager.shouldRender(entity, clippinghelper, d0, d1, d2) || entity.isRidingOrBeingRiddenBy(this.mc.player)) && (entity != activeRenderInfoIn.getRenderViewEntity() || activeRenderInfoIn.isThirdPerson() || activeRenderInfoIn.getRenderViewEntity() instanceof LivingEntity && ((LivingEntity)activeRenderInfoIn.getRenderViewEntity()).isSleeping()) && (!(entity instanceof ClientPlayerEntity) || activeRenderInfoIn.getRenderViewEntity() == entity || flag4))
                {
                    String s = entity.getClass().getName();
                    List<Entity> list = this.mapEntityLists.get(s);

                    if (list == null)
                    {
                        list = new ArrayList<>();
                        this.mapEntityLists.put(s, list);
                    }

                    list.add(entity);
                }
            }
        }

        for (List<Entity> list1 : this.mapEntityLists.values())
        {
            for (Entity entity1 : list1)
            {
                ++this.countEntitiesRendered;

                if (entity1.ticksExisted == 0)
                {
                    entity1.lastTickPosX = entity1.getPosX();
                    entity1.lastTickPosY = entity1.getPosY();
                    entity1.lastTickPosZ = entity1.getPosZ();
                }

                IRenderTypeBuffer irendertypebuffer;

                if (this.isRenderEntityOutlines() && this.mc.isEntityGlowing(entity1))
                {
                    flag3 = true;
                    OutlineLayerBuffer outlinelayerbuffer = this.renderTypeTextures.getOutlineBufferSource();
                    irendertypebuffer = outlinelayerbuffer;
                    int k2 = entity1.getTeamColor();
                    int l2 = 255;
                    int i3 = k2 >> 16 & 255;
                    int i2 = k2 >> 8 & 255;
                    int j2 = k2 & 255;
                    outlinelayerbuffer.setColor(i3, i2, j2, 255);
                }
                else
                {
                    irendertypebuffer = irendertypebuffer$impl;
                }

                this.renderedEntity = entity1;

                if (flag1)
                {
                    Shaders.nextEntity(entity1);
                }

                this.renderEntity(entity1, d0, d1, d2, partialTicks, matrixStackIn, irendertypebuffer);
                this.renderedEntity = null;
            }

            list1.clear();
        }

        this.checkMatrixStack(matrixStackIn);
        irendertypebuffer$impl.finish(RenderType.getEntitySolid(AtlasTexture.LOCATION_BLOCKS_TEXTURE));
        irendertypebuffer$impl.finish(RenderType.getEntityCutout(AtlasTexture.LOCATION_BLOCKS_TEXTURE));
        irendertypebuffer$impl.finish(RenderType.getEntityCutoutNoCull(AtlasTexture.LOCATION_BLOCKS_TEXTURE));
        irendertypebuffer$impl.finish(RenderType.getEntitySmoothCutout(AtlasTexture.LOCATION_BLOCKS_TEXTURE));

        if (flag1)
        {
            Shaders.endEntities();
            Shaders.beginBlockEntities();
        }

        iprofiler.endStartSection("blockentities");
        SignTileEntityRenderer.updateTextRenderDistance();
        boolean flag5 = false;
        ClippingHelper clippinghelper1 = clippinghelper;
        label354:

        for (WorldRenderer.LocalRenderInformationContainer worldrenderer$localrenderinformationcontainer1 : this.renderInfosTileEntities)
        {
            List<TileEntity> list2 = worldrenderer$localrenderinformationcontainer1.renderChunk.getCompiledChunk().getTileEntities();

            if (!list2.isEmpty())
            {
                Iterator iterator1 = list2.iterator();

                while (true)
                {
                    TileEntity tileentity1;
                    AxisAlignedBB axisalignedbb1;

                    do
                    {
                        if (!iterator1.hasNext())
                        {
                            continue label354;
                        }

                        tileentity1 = (TileEntity)iterator1.next();

                        axisalignedbb1 = null;
                    }
                    while (flag5 && axisalignedbb1 != null && !clippinghelper1.isBoundingBoxInFrustum(axisalignedbb1));

                    if (flag1)
                    {
                        Shaders.nextBlockEntity(tileentity1);
                    }

                    BlockPos blockpos3 = tileentity1.getPos();
                    IRenderTypeBuffer irendertypebuffer1 = irendertypebuffer$impl;
                    matrixStackIn.push();
                    matrixStackIn.translate((double)blockpos3.getX() - d0, (double)blockpos3.getY() - d1, (double)blockpos3.getZ() - d2);
                    SortedSet<DestroyBlockProgress> sortedset = this.damageProgress.get(blockpos3.toLong());

                    if (sortedset != null && !sortedset.isEmpty())
                    {
                        int j3 = sortedset.last().getPartialBlockDamage();

                        if (j3 >= 0)
                        {
                            MatrixStack.Entry matrixstack$entry = matrixStackIn.getLast();
                            IVertexBuilder ivertexbuilder = new MatrixApplyingVertexBuilder(this.renderTypeTextures.getCrumblingBufferSource().getBuffer(ModelBakery.DESTROY_RENDER_TYPES.get(j3)), matrixstack$entry.getMatrix(), matrixstack$entry.getNormal());
                            irendertypebuffer1 = (p_lambda$updateCameraAndRender$1_2_) ->
                            {
                                IVertexBuilder ivertexbuilder3 = irendertypebuffer$impl.getBuffer(p_lambda$updateCameraAndRender$1_2_);
                                return p_lambda$updateCameraAndRender$1_2_.isUseDelegate() ? VertexBuilderUtils.newDelegate(ivertexbuilder, ivertexbuilder3) : ivertexbuilder3;
                            };
                        }
                    }

                    TileEntityRendererDispatcher.instance.renderTileEntity(tileentity1, partialTicks, matrixStackIn, irendertypebuffer1);
                    matrixStackIn.pop();
                    ++this.countTileEntitiesRendered;
                }
            }
        }

        synchronized (this.setTileEntities)
        {
            Iterator iterator = this.setTileEntities.iterator();
            label329:

            while (true)
            {
                TileEntity tileentity;
                AxisAlignedBB axisalignedbb;

                do
                {
                    if (!iterator.hasNext())
                    {
                        break label329;
                    }

                    tileentity = (TileEntity)iterator.next();
                    axisalignedbb = null;
                }
                while (flag5 && axisalignedbb != null && !clippinghelper1.isBoundingBoxInFrustum(axisalignedbb));

                if (flag1)
                {
                    Shaders.nextBlockEntity(tileentity);
                }

                BlockPos blockpos2 = tileentity.getPos();
                matrixStackIn.push();
                matrixStackIn.translate((double)blockpos2.getX() - d0, (double)blockpos2.getY() - d1, (double)blockpos2.getZ() - d2);
                TileEntityRendererDispatcher.instance.renderTileEntity(tileentity, partialTicks, matrixStackIn, irendertypebuffer$impl);
                matrixStackIn.pop();
                ++this.countTileEntitiesRendered;
            }
        }

        this.checkMatrixStack(matrixStackIn);
        irendertypebuffer$impl.finish(RenderType.getSolid());
        irendertypebuffer$impl.finish(Atlases.getSolidBlockType());
        irendertypebuffer$impl.finish(Atlases.getCutoutBlockType());
        irendertypebuffer$impl.finish(Atlases.getBedType());
        irendertypebuffer$impl.finish(Atlases.getShulkerBoxType());
        irendertypebuffer$impl.finish(Atlases.getSignType());
        irendertypebuffer$impl.finish(Atlases.getChestType());
        irendertypebuffer$impl.finish(Atlases.getBannerType());
        this.renderTypeTextures.getOutlineBufferSource().finish();

        if (Config.isFastRender())
        {
            RenderStateManager.disableCache();
        }

        if (flag3)
        {
            this.entityOutlineShader.render(partialTicks);
            this.mc.getFramebuffer().bindFramebuffer(false);
        }

        if (flag1)
        {
            Shaders.endBlockEntities();
        }

        this.renderOverlayDamaged = true;
        iprofiler.endStartSection("destroyProgress");

        for (Entry<SortedSet<DestroyBlockProgress>> entry : this.damageProgress.long2ObjectEntrySet())
        {
            BlockPos blockpos1 = BlockPos.fromLong(entry.getLongKey());
            double d3 = (double)blockpos1.getX() - d0;
            double d4 = (double)blockpos1.getY() - d1;
            double d5 = (double)blockpos1.getZ() - d2;

            if (!(d3 * d3 + d4 * d4 + d5 * d5 > 1024.0D))
            {
                SortedSet<DestroyBlockProgress> sortedset1 = entry.getValue();

                if (sortedset1 != null && !sortedset1.isEmpty())
                {
                    int k3 = sortedset1.last().getPartialBlockDamage();
                    matrixStackIn.push();
                    matrixStackIn.translate((double)blockpos1.getX() - d0, (double)blockpos1.getY() - d1, (double)blockpos1.getZ() - d2);
                    MatrixStack.Entry matrixstack$entry1 = matrixStackIn.getLast();
                    IVertexBuilder ivertexbuilder1 = new MatrixApplyingVertexBuilder(this.renderTypeTextures.getCrumblingBufferSource().getBuffer(ModelBakery.DESTROY_RENDER_TYPES.get(k3)), matrixstack$entry1.getMatrix(), matrixstack$entry1.getNormal());
                    this.mc.getBlockRendererDispatcher().renderBlockDamage(this.world.getBlockState(blockpos1), blockpos1, this.world, matrixStackIn, ivertexbuilder1);
                    matrixStackIn.pop();
                }
            }
        }

        this.renderOverlayDamaged = false;
        RenderUtils.flushRenderBuffers();
        --renderEntitiesCounter;
        this.checkMatrixStack(matrixStackIn);
        RayTraceResult raytraceresult = this.mc.objectMouseOver;

        if (drawBlockOutline && raytraceresult != null && raytraceresult.getType() == RayTraceResult.Type.BLOCK)
        {
            iprofiler.endStartSection("outline");
            BlockPos blockpos = ((BlockRayTraceResult)raytraceresult).getPos();
            BlockState blockstate = this.world.getBlockState(blockpos);

            if (flag1)
            {
                ShadersRender.beginOutline();
            }

            boolean flag7;

            flag7 = !blockstate.isAir() && this.world.getWorldBorder().contains(blockpos);

            if (flag7)
            {
                IVertexBuilder ivertexbuilder2 = irendertypebuffer$impl.getBuffer(RenderType.getLines());
                this.drawSelectionBox(matrixStackIn, ivertexbuilder2, activeRenderInfoIn.getRenderViewEntity(), d0, d1, d2, blockpos, blockstate);
            }

            if (flag1)
            {
                irendertypebuffer$impl.finish(RenderType.getLines());
                ShadersRender.endOutline();
            }
        }
        else if (raytraceresult != null && raytraceresult.getType() == RayTraceResult.Type.ENTITY)
        {
        }

        RenderSystem.pushMatrix();
        RenderSystem.multMatrix(matrixStackIn.getLast().getMatrix());
        boolean flag6 = GlStateManager.isFogEnabled();
        GlStateManager.disableFog();

        if (flag1)
        {
            ShadersRender.beginDebug();
        }

        this.mc.debugRenderer.render(matrixStackIn, irendertypebuffer$impl, d0, d1, d2);
        RenderSystem.popMatrix();
        irendertypebuffer$impl.finish(Atlases.getTranslucentCullBlockType());
        irendertypebuffer$impl.finish(Atlases.getBannerType());
        irendertypebuffer$impl.finish(Atlases.getShieldType());
        irendertypebuffer$impl.finish(RenderType.getArmorGlint());
        irendertypebuffer$impl.finish(RenderType.getArmorEntityGlint());
        irendertypebuffer$impl.finish(RenderType.getGlint());
        irendertypebuffer$impl.finish(RenderType.getGlintDirect());
        irendertypebuffer$impl.finish(RenderType.getGlintTranslucent());
        irendertypebuffer$impl.finish(RenderType.getEntityGlint());
        irendertypebuffer$impl.finish(RenderType.getEntityGlintDirect());
        irendertypebuffer$impl.finish(RenderType.getWaterMask());
        this.renderTypeTextures.getCrumblingBufferSource().finish();
        GlStateManager.setFogEnabled(flag6);

        if (flag1)
        {
            irendertypebuffer$impl.finish();
            ShadersRender.endDebug();
            Shaders.preRenderHand();
            ShadersRender.renderHand0(gameRendererIn, matrixStackIn, activeRenderInfoIn, partialTicks);
            Shaders.preWater();
        }

        if (this.field_239227_K_ != null)
        {
            irendertypebuffer$impl.finish(RenderType.getLines());
            irendertypebuffer$impl.finish();
            this.field_239222_F_.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
            this.field_239222_F_.func_237506_a_(this.mc.getFramebuffer());
            iprofiler.endStartSection("translucent");
            this.renderBlockLayer(RenderType.getTranslucent(), matrixStackIn, d0, d1, d2);
            iprofiler.endStartSection("string");
            this.renderBlockLayer(RenderType.getTripwire(), matrixStackIn, d0, d1, d2);
            this.field_239224_H_.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
            this.field_239224_H_.func_237506_a_(this.mc.getFramebuffer());
            RenderState.field_239237_T_.setupRenderState();
            iprofiler.endStartSection("particles");
            this.mc.particles.renderParticles(matrixStackIn, irendertypebuffer$impl, lightmapIn, activeRenderInfoIn, partialTicks, clippinghelper);
            RenderState.field_239237_T_.clearRenderState();
        }
        else
        {
            iprofiler.endStartSection("translucent");

            if (flag1)
            {
                Shaders.beginWater();
            }

            this.renderBlockLayer(RenderType.getTranslucent(), matrixStackIn, d0, d1, d2);

            if (flag1)
            {
                Shaders.endWater();
            }

            irendertypebuffer$impl.finish(RenderType.getLines());
            irendertypebuffer$impl.finish();
            iprofiler.endStartSection("string");
            this.renderBlockLayer(RenderType.getTripwire(), matrixStackIn, d0, d1, d2);
            iprofiler.endStartSection("particles");

            if (flag1)
            {
                Shaders.beginParticles();
            }

            this.mc.particles.renderParticles(matrixStackIn, irendertypebuffer$impl, lightmapIn, activeRenderInfoIn, partialTicks, clippinghelper);

            if (flag1)
            {
                Shaders.endParticles();
            }
        }


        Render3DPosedEvent event = new Render3DPosedEvent(matrixStackIn, matrix4f, activeRenderInfoIn, this, partialTicks, finishTimeNano, d0, d1, d2);
        Heaven.getInstance().getEventManager().post(event);


//        GlStateManager.setFogAllowed(true);
        RenderSystem.pushMatrix();
        RenderSystem.multMatrix(matrixStackIn.getLast().getMatrix());

        if (this.mc.gameSettings.getCloudOption() != CloudOption.OFF)
        {
            if (this.field_239227_K_ != null)
            {
                this.field_239226_J_.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
                RenderState.field_239239_V_.setupRenderState();
                iprofiler.endStartSection("clouds");
                this.renderClouds(matrixStackIn, partialTicks, d0, d1, d2);
                RenderState.field_239239_V_.clearRenderState();
            }
            else
            {
                iprofiler.endStartSection("clouds");
                this.renderClouds(matrixStackIn, partialTicks, d0, d1, d2);
            }
        }

        if (Config.isShaders()) {
            ShadersRender.beginOutline();
        }

        Heaven.getInstance().getEventManager().post(new WorldRenderEvent(matrixStackIn, partialTicks, mc.gameRenderer.getActiveRenderInfo()));

        if (Config.isShaders()) {
            ShadersRender.endOutline();
        }


        if (this.field_239227_K_ != null)
        {
            RenderState.field_239238_U_.setupRenderState();
            iprofiler.endStartSection("weather");
            this.renderRainSnow(lightmapIn, partialTicks, d0, d1, d2);
            this.renderWorldBorder(activeRenderInfoIn);
            RenderState.field_239238_U_.clearRenderState();
            this.field_239227_K_.render(partialTicks);
            this.mc.getFramebuffer().bindFramebuffer(false);
        }
        else
        {
            RenderSystem.depthMask(false);

            if (Config.isShaders())
            {
                GlStateManager.depthMask(Shaders.isRainDepth());
            }

            iprofiler.endStartSection("weather");

            if (flag1)
            {
                Shaders.beginWeather();
            }

            this.renderRainSnow(lightmapIn, partialTicks, d0, d1, d2);

            if (flag1)
            {
                Shaders.endWeather();
            }

            this.renderWorldBorder(activeRenderInfoIn);
            RenderSystem.depthMask(true);
        }

        this.renderDebug(activeRenderInfoIn);
        RenderSystem.shadeModel(7424);
        RenderSystem.depthMask(true);
        RenderSystem.disableBlend();
        RenderSystem.popMatrix();
        FogRenderer.resetFog();

        for (IBaritone ibaritone : BaritoneAPI.getProvider().getAllBaritones()) {
            ibaritone.getGameEventHandler().onRenderPass(new RenderEvent(partialTicks, matrixStackIn, projectionIn));
        }
    }


ColorUtils:
Expand Collapse Copy
    public static float[] getRGBAf(int c) {
        return new float[]{(float)getRed(c) / 255.0F, (float)getGreen(c) / 255.0F, (float)getBlue(c) / 255.0F, (float)getAlpha(c) / 255.0F};
    }

    public static int getRed(final int hex) {
        return hex >> 16 & 255;
    }

    public static int getGreen(final int hex) {
        return hex >> 8 & 255;
    }

    public static int getBlue(final int hex) {
        return hex & 255;
    }

    public static int getAlpha(final int hex) {
        return hex >> 24 & 255;
    }

BlurUtils:
Expand Collapse Copy
package ru.heaven.util.render;

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.shader.Framebuffer;
import org.lwjgl.BufferUtils;

import java.nio.FloatBuffer;

import ru.heaven.util.Wrapper;
import ru.heaven.util.render.shader.Sahder;
import ru.heaven.util.render.shader.ShaderManager;

/**
 * @author chuppachups8368
 * @since 31.03.2026
 */
public class BlurUtils implements Wrapper {

    private static Sahder blur;
    private static Framebuffer framebuffer = new Framebuffer(1, 1, true, false);

    private static void setupUniforms(float dir1, float dir2, float radius) {
        Sahder shader = getBlurShader();
        shader.setUniform("textureIn", 0);
        shader.setUniformF("texelSize", 1.0F / (float) mc.getMainWindow().getWidth(), 1.0F / (float) mc.getMainWindow().getHeight());
        shader.setUniformF("direction", dir1, dir2);
        shader.setUniformF("radius", radius);

        FloatBuffer weightBuffer = BufferUtils.createFloatBuffer(256);
        for (int i = 0; i <= (int) radius; i++) {
            weightBuffer.put(calculateGaussianValue(i, radius / 2.0F));
        }

        weightBuffer.rewind();
        RenderSystem.glUniform1(shader.getUniform("weights"), weightBuffer);
    }

    public static void startBlur() {
        StencilUtils.initStencilToWrite();
    }

    public static void endBlur(float radius, float compression) {
        StencilUtils.readStencilBuffer(1);

        framebuffer = createFrameBuffer(framebuffer);
        framebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        framebuffer.bindFramebuffer(false);

        Sahder shader = getBlurShader();
        shader.begin();
        setupUniforms(compression, 0.0F, radius);

        GlStateManager.bindTexture(mc.getFramebuffer().func_242996_f());
        shader.drawQuads();
        framebuffer.unbindFramebuffer();
        shader.end();

        mc.getFramebuffer().bindFramebuffer(false);
        shader.begin();
        setupUniforms(0.0F, compression, radius);
        GlStateManager.bindTexture(framebuffer.func_242996_f());
        shader.drawQuads();
        shader.end();

        StencilUtils.uninitStencilBuffer();
        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
        GlStateManager.bindTexture(0);
    }

    public static void blur(float radius, float compression) {
        framebuffer = createFrameBuffer(framebuffer);
        framebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        framebuffer.bindFramebuffer(false);

        Sahder shader = getBlurShader();
        shader.begin();
        setupUniforms(compression, 0.0F, radius);
        GlStateManager.bindTexture(mc.getFramebuffer().func_242996_f());
        shader.drawQuads();
        framebuffer.unbindFramebuffer();
        shader.end();

        mc.getFramebuffer().bindFramebuffer(false);
        shader.begin();
        setupUniforms(0.0F, compression, radius);
        GlStateManager.bindTexture(framebuffer.func_242996_f());
        shader.drawQuads();
        shader.end();

        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
        GlStateManager.bindTexture(0);
    }

    public static void blur(float radius, float compression, float alpha) {
        framebuffer = createFrameBuffer(framebuffer);
        framebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
        framebuffer.bindFramebuffer(false);

        Sahder shader = getBlurShader();
        shader.begin();
        setupUniforms(compression, 0.0F, radius);
        GlStateManager.bindTexture(mc.getFramebuffer().func_242996_f());
        shader.drawQuads();
        framebuffer.unbindFramebuffer();
        shader.end();

        mc.getFramebuffer().bindFramebuffer(false);
        shader.begin();
        setupUniforms(0.0F, compression, radius);
        GlStateManager.bindTexture(framebuffer.func_242996_f());
        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        GlStateManager.color4f(1.0F, 1.0F, 1.0F, alpha);
        shader.drawQuads();
        RenderSystem.disableBlend();
        shader.end();

        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
        GlStateManager.bindTexture(0);
    }

    private static Framebuffer createFrameBuffer(Framebuffer framebuffer) {
        int width = Math.max(1, mc.getMainWindow().getWidth());
        int height = Math.max(1, mc.getMainWindow().getHeight());
        if (framebuffer == null || framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height) {
            if (framebuffer != null) {
                framebuffer.deleteFramebuffer();
            }
            return new Framebuffer(width, height, true, false);
        }
        return framebuffer;
    }

    public static float calculateGaussianValue(float x, float sigma) {
        double output = 1.0 / Math.sqrt(2.0 * Math.PI * (sigma * sigma));
        return (float) (output * Math.exp(-(x * x) / (2.0 * (sigma * sigma))));
    }

    private static Sahder getBlurShader() {
        if (blur == null) {
            blur = ShaderManager.shader("gaussian.frag");
        }
        return blur;
    }
}


gaussian.frag:
Expand Collapse Copy
#version 120

uniform sampler2D textureIn;
uniform vec2 texelSize, direction;
uniform float radius;
uniform float weights[256];

#define offset texelSize * direction

void main() {
    vec3 blr = texture2D(textureIn, gl_TexCoord[0].st).rgb * weights[0];

    for (int i = 1; i <= int(radius); i++) {
        float weight = weights[i];
        vec2 sampleOffset = i * offset;
        blr += texture2D(textureIn, gl_TexCoord[0].st + sampleOffset).rgb * weight;
        blr += texture2D(textureIn, gl_TexCoord[0].st - sampleOffset).rgb * weight;
    }

    gl_FragColor = vec4(blr, 1.0);
}
 
Назад
Сверху Снизу