Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
ГайдКлиент с нуля | GlowESP aka OpenGL Framebuffer
Framebuffer (RenderTarget в DirectX) - это технология отрисовки объектов в текстуру. То есть если раньше мы рисовали сразу на экран, то теперь мы рисуем в отдельную текстуру.
Я предлагаю реализовать сразу что-нибудь сложное, например GlowESP. Принцип работы у него такой:
1. Создать фреймбуффер сущностей
1. Перед отрисовкой забиндить наш фреймбуффер, чтобы отрисовка шла в него
2. В renderIngameGui отобразить текстуру два раза: первый раз применив шейдер блюра, второй раз без изменений
Чтобы было нагляднее, каждое своё действие я буду показывать в скринами из фотошопа. Поехали
Создание фреймбуффера
Вот у нас основной фреймбуффер майнкрафта: Посмотреть вложение 281740
А нам нужен новый. Как это делают многие - предлагаю создать метод createFramebuffer потому, что у него фиксированный размер, а значит его придётся при каждом изменении размера окна пересоздавать:
Java:
private Framebuffer createFramebuffer(Framebuffer framebuffer) {
MainWindow mainWindow = mc.getMainWindow(); // Получаем окно
int width = mainWindow.getFramebufferWidth();
int height = mainWindow.getFramebufferHeight();
if (framebuffer == null || framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height) { // Если framebuffer ещё не создан или размер не совпадает
if (framebuffer != null) // Если framebuffer уже был создан
framebuffer.deleteFramebuffer(); // Удаляем (ведь потеря ресурсов это плохо)
framebuffer = new Framebuffer(width, height, true, Minecraft.IS_RUNNING_ON_MAC); // Создаём новый framebuffer
}
return framebuffer;
}
P.S. На новых версиях есть resize, можно использовать его
private Framebuffer entitiesFramebuffer;
Считайте теперь у нас есть новый пустой слой: Посмотреть вложение 281741
Отрисовка игроков
Чтобы наш фреймбуффер заполнить нужно сделать bind, затем отрисовать и сделать unbind. Прям как с шейдером.
Находим отрисовку сущностей: Посмотреть вложение 281742
Перед перечислением добавляем:
После перечисления:
Теперь мы перенесли игроков на новый слой:
Но слой майнкрафта выключился, поэтому биндим его обратно:
Java:
mc.getFramebuffer().bindFramebuffer(true);
Отображаем фреймбуффер на экран
Чтобы не терять времени и не рисовать текстуру фреймбуффера самому мы воспользуемся методом framebufferRenderExtRaw. При отрисовке оверлея (renderIngameGui) рисуем наш фреймбуффер:
Только теперь есть проблема - белого фона по факту быть не должно. Это из-за того, что framebufferRenderExtRaw отключает blend. Врубаем его обратно и получаем:
Вот теперь уже лучше. С ходу мы уже получили эффект просвета, как видите спрут отображается поверх всего
Glow или же Blur эффект
Снова заходим в фотошоп и накидываем на наш слой с сущностями блюр:
Т.к. блюр расширяет границы, то при повторной отрисовке он оставит за собой следы расширения исходя из радиуса:
Тогда перед отрисовкой мы применяем шейдер блюра и получаем такую картину:
Framebuffer (RenderTarget в DirectX) - это технология отрисовки объектов в текстуру. То есть если раньше мы рисовали сразу на экран, то теперь мы рисуем в отдельную текстуру.
Я предлагаю реализовать сразу что-нибудь сложное, например GlowESP. Принцип работы у него такой:
1. Создать фреймбуффер сущностей
1. Перед отрисовкой забиндить наш фреймбуффер, чтобы отрисовка шла в него
2. В renderIngameGui отобразить текстуру два раза: первый раз применив шейдер блюра, второй раз без изменений
Чтобы было нагляднее, каждое своё действие я буду показывать в скринами из фотошопа. Поехали
Создание фреймбуффера
Вот у нас основной фреймбуффер майнкрафта: Посмотреть вложение 281740
А нам нужен новый. Как это делают многие - предлагаю создать метод createFramebuffer потому, что у него фиксированный размер, а значит его придётся при каждом изменении размера окна пересоздавать:
Java:
private Framebuffer createFramebuffer(Framebuffer framebuffer) {
MainWindow mainWindow = mc.getMainWindow(); // Получаем окно
int width = mainWindow.getFramebufferWidth();
int height = mainWindow.getFramebufferHeight();
if (framebuffer == null || framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height) { // Если framebuffer ещё не создан или размер не совпадает
if (framebuffer != null) // Если framebuffer уже был создан
framebuffer.deleteFramebuffer(); // Удаляем (ведь потеря ресурсов это плохо)
framebuffer = new Framebuffer(width, height, true, Minecraft.IS_RUNNING_ON_MAC); // Создаём новый framebuffer
}
return framebuffer;
}
P.S. На новых версиях есть resize, можно использовать его
private Framebuffer entitiesFramebuffer;
Считайте теперь у нас есть новый пустой слой: Посмотреть вложение 281741
Отрисовка игроков
Чтобы наш фреймбуффер заполнить нужно сделать bind, затем отрисовать и сделать unbind. Прям как с шейдером.
Находим отрисовку сущностей: Посмотреть вложение 281742
Перед перечислением добавляем:
После перечисления:
Теперь мы перенесли игроков на новый слой:
Но слой майнкрафта выключился, поэтому биндим его обратно:
Java:
mc.getFramebuffer().bindFramebuffer(true);
Отображаем фреймбуффер на экран
Чтобы не терять времени и не рисовать текстуру фреймбуффера самому мы воспользуемся методом framebufferRenderExtRaw. При отрисовке оверлея (renderIngameGui) рисуем наш фреймбуффер:
Только теперь есть проблема - белого фона по факту быть не должно. Это из-за того, что framebufferRenderExtRaw отключает blend. Врубаем его обратно и получаем:
Вот теперь уже лучше. С ходу мы уже получили эффект просвета, как видите спрут отображается поверх всего
Glow или же Blur эффект
Снова заходим в фотошоп и накидываем на наш слой с сущностями блюр:
Т.к. блюр расширяет границы, то при повторной отрисовке он оставит за собой следы расширения исходя из радиуса:
Тогда перед отрисовкой мы применяем шейдер блюра и получаем такую картину: