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

Гайд Клиент с нуля | GlowESP aka OpenGL Framebuffer

Список:
1. Создаём главный класс + снимаем ограничения - https://yougame.biz/threads/325113
2. Автобус евентов - https://yougame.biz/threads/325114
3. OpenGL + Шейдеры + Рендер - https://yougame.biz/threads/325115
4. Аим - https://yougame.biz/threads/325188
5. GlowESP aka OpenGL Framebuffer - https://yougame.biz/threads/325211/
6. Текст, шрифты, атлас - https://yougame.biz/threads/325292

Framebuffer (RenderTarget в DirectX) - это технология отрисовки объектов в текстуру. То есть если раньше мы рисовали сразу на экран, то теперь мы рисуем в отдельную текстуру.

Я предлагаю реализовать сразу что-нибудь сложное, например GlowESP. Принцип работы у него такой:
1. Создать фреймбуффер сущностей
1. Перед отрисовкой забиндить наш фреймбуффер, чтобы отрисовка шла в него
2. В renderIngameGui отобразить текстуру два раза: первый раз применив шейдер блюра, второй раз без изменений

Чтобы было нагляднее, каждое своё действие я буду показывать в скринами из фотошопа. Поехали

Создание фреймбуффера
Вот у нас основной фреймбуффер майнкрафта:
Посмотреть вложение 281740
А нам нужен новый. Как это делают многие - предлагаю создать метод createFramebuffer потому, что у него фиксированный размер, а значит его придётся при каждом изменении размера окна пересоздавать:
Java:
Expand Collapse Copy
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
Перед перечислением добавляем:
FoC21Ao.png

После перечисления:
YebgIbz.png

Теперь мы перенесли игроков на новый слой:
v9KhXtN.png

Но слой майнкрафта выключился, поэтому биндим его обратно:
Java:
Expand Collapse Copy
mc.getFramebuffer().bindFramebuffer(true);

Отображаем фреймбуффер на экран
Чтобы не терять времени и не рисовать текстуру фреймбуффера самому мы воспользуемся методом framebufferRenderExtRaw. При отрисовке оверлея (renderIngameGui) рисуем наш фреймбуффер:
Java:
Expand Collapse Copy
Framebuffer entitiesFramebuffer = mc.worldRenderer.getEntitiesFramebuffer();
entitiesFramebuffer.framebufferRenderExtRaw(mc.getMainWindow().getWidth(), mc.getMainWindow().getHeight(), true);
v8PqN1f.png

Только теперь есть проблема - белого фона по факту быть не должно. Это из-за того, что framebufferRenderExtRaw отключает blend. Врубаем его обратно и получаем:
VisZfen.png

Вот теперь уже лучше. С ходу мы уже получили эффект просвета, как видите спрут отображается поверх всего
yvEA2ON.png


Glow или же Blur эффект
Снова заходим в фотошоп и накидываем на наш слой с сущностями блюр:
tMvp5D9.png

Т.к. блюр расширяет границы, то при повторной отрисовке он оставит за собой следы расширения исходя из радиуса:
dKt4CJi.png


Тогда перед отрисовкой мы применяем шейдер блюра и получаем такую картину:
RxLRxVJ.png

Затем рисуем второй раз, но уже без шейдера:
FB3H8SB.png
А где это всё собирать, и можно пж тутор на всё что скачать и как можно юзать сурсы чтобы сделать килку/елитра свап
 
А где это всё собирать, и можно пж тутор на всё что скачать и как можно юзать сурсы чтобы сделать килку/елитра свап
основная программа для работы - Intellij Idea

Пожалуйста, авторизуйтесь для просмотра ссылки.
- mcp, декомпилированная именно версия майнкрафта

для создания модов под Fabric/Forge можно установить плагин Minecraft Developing и при создании проекта выбрать шаблон «Minecraft»

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.

 
Список:
1. Создаём главный класс + снимаем ограничения - https://yougame.biz/threads/325113
2. Автобус евентов - https://yougame.biz/threads/325114
3. OpenGL + Шейдеры + Рендер - https://yougame.biz/threads/325115
4. Аим - https://yougame.biz/threads/325188
5. GlowESP aka OpenGL Framebuffer - https://yougame.biz/threads/325211/
6. Текст, шрифты, атлас - https://yougame.biz/threads/325292

Framebuffer (RenderTarget в DirectX) - это технология отрисовки объектов в текстуру. То есть если раньше мы рисовали сразу на экран, то теперь мы рисуем в отдельную текстуру.

Я предлагаю реализовать сразу что-нибудь сложное, например GlowESP. Принцип работы у него такой:
1. Создать фреймбуффер сущностей
1. Перед отрисовкой забиндить наш фреймбуффер, чтобы отрисовка шла в него
2. В renderIngameGui отобразить текстуру два раза: первый раз применив шейдер блюра, второй раз без изменений

Чтобы было нагляднее, каждое своё действие я буду показывать в скринами из фотошопа. Поехали

Создание фреймбуффера
Вот у нас основной фреймбуффер майнкрафта:
Посмотреть вложение 281740
А нам нужен новый. Как это делают многие - предлагаю создать метод createFramebuffer потому, что у него фиксированный размер, а значит его придётся при каждом изменении размера окна пересоздавать:
Java:
Expand Collapse Copy
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
Перед перечислением добавляем:
FoC21Ao.png

После перечисления:
YebgIbz.png

Теперь мы перенесли игроков на новый слой:
v9KhXtN.png

Но слой майнкрафта выключился, поэтому биндим его обратно:
Java:
Expand Collapse Copy
mc.getFramebuffer().bindFramebuffer(true);

Отображаем фреймбуффер на экран
Чтобы не терять времени и не рисовать текстуру фреймбуффера самому мы воспользуемся методом framebufferRenderExtRaw. При отрисовке оверлея (renderIngameGui) рисуем наш фреймбуффер:
Java:
Expand Collapse Copy
Framebuffer entitiesFramebuffer = mc.worldRenderer.getEntitiesFramebuffer();
entitiesFramebuffer.framebufferRenderExtRaw(mc.getMainWindow().getWidth(), mc.getMainWindow().getHeight(), true);
v8PqN1f.png

Только теперь есть проблема - белого фона по факту быть не должно. Это из-за того, что framebufferRenderExtRaw отключает blend. Врубаем его обратно и получаем:
VisZfen.png

Вот теперь уже лучше. С ходу мы уже получили эффект просвета, как видите спрут отображается поверх всего
yvEA2ON.png


Glow или же Blur эффект
Снова заходим в фотошоп и накидываем на наш слой с сущностями блюр:
tMvp5D9.png

Т.к. блюр расширяет границы, то при повторной отрисовке он оставит за собой следы расширения исходя из радиуса:
dKt4CJi.png


Тогда перед отрисовкой мы применяем шейдер блюра и получаем такую картину:
RxLRxVJ.png

Затем рисуем второй раз, но уже без шейдера:
FB3H8SB.png
Спасибо огромное, очень помогло. +rep
 
Назад
Сверху Снизу