Вопрос Как сделать переливание градиента на базе минцеда

Начинающий
Статус
Оффлайн
Регистрация
2 Апр 2023
Сообщения
59
Реакции[?]
0
Поинты[?]
0

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

кто может помочь сделать переливание градиента на текст и просто переливающийся градиент
 
PoC Life
Пользователь
Статус
Оффлайн
Регистрация
22 Авг 2022
Сообщения
319
Реакции[?]
45
Поинты[?]
35K
кто может помочь сделать переливание градиента на текст и просто переливающийся градиент
Либо делаешь шейдером, либо на каждую букву выделяешь свой цвет.
Шейдер градиентной маски (4 цвета) с тенасити:
Код:
#version 120

uniform vec2 location, rectSize;
uniform sampler2D tex;
uniform vec3 color1, color2, color3, color4;
uniform float alpha;

#define NOISE .5/255.0

vec3 createGradient(vec2 coords, vec3 color1, vec3 color2, vec3 color3, vec3 color4){
    vec3 color = mix(mix(color1.rgb, color2.rgb, coords.y), mix(color3.rgb, color4.rgb, coords.y), coords.x);
    //Dithering the color from https://shader-tutorial.dev/advanced/color-banding-dithering/
    color += mix(NOISE, -NOISE, fract(sin(dot(coords.xy, vec2(12.9898,78.233))) * 43758.5453));
    return color;
}

void main() {
    vec2 coords = (gl_FragCoord.xy - location) / rectSize;
    float texColorAlpha = texture2D(tex, gl_TexCoord[0].st).a;
    gl_FragColor = vec4(createGradient(coords, color1, color2, color3, color4), texColorAlpha * alpha);
}
Если для каждого символа генерировать цвет, то так:
Java:
private static final Pattern GRADIENT_PATTERN = Pattern.compile("<#([0-9A-Fa-f]{6})>(.*?)</#([0-9A-Fa-f]{6})>", Pattern.CASE_INSENSITIVE);
    private static final Pattern HEX_PATTERN = Pattern.compile("<#([A-Fa-f0-9]{6})>");

private static Color[] getGradientColors(Color color1, Color color2, int step) {
        Color[] colors = new Color[step];
        int stepR = Math.abs(color1.getRed() - color2.getRed()) / (step-1);
        int stepG = Math.abs(color1.getGreen() - color2.getGreen()) / (step-1);
        int stepB = Math.abs(color1.getBlue() - color2.getBlue()) / (step-1);

        int[] direction = new int[] {
                color1.getRed() < color2.getRed() ? +1 : -1,
                color1.getGreen() < color2.getGreen() ? +1 : -1,
                color1.getBlue() < color2.getBlue() ? +1 : -1
        };
        for (int i = 0; i < step; i++) {
            Color color = new Color(color1.getRed() + ((stepR * i) * direction[0]), color1.getGreen() + ((stepG * i) * direction[1]), color1.getBlue() + ((stepB * i) * direction[2]));
            colors[i] = color;
        }

        return colors;
    }
step это длина строки. Пример:
Java:
String text = "Текст";
Color[] colors = getGradientColors(Color.RED, Color.ORANGE, text.length()); // Генерируем массив с цветами
char[] chars = text.toCharArray(); // Получем массив из символов (то есть Т, е, к, с, т)

int xOffset = 0;
for (int i = 0; i < characters.length; i++) {
    Color color = colors[i]; // Получаем цвет символа
    char character = chars[i]; // Получаем символ
    
    Fonts.ШРИФТ.drawString(String.valueOf(character), xOffset, 0, color.getRGB()); // Отрисовываем символ
    xOffset += Fonts.ШРИФТ.getStringWidth(String.valueOf(character))+1; // Прибавляем к смещению оси X длину символа + 1
}
Или есть ещё один способ, в загрузку клиента захуярить чтобы картинка с символами (generateFontImage если пасты рича (minced входит)), то вместо g.setColor(Color.WHITE); можно заменить на g.setFill(new GradientFill(...)); но это неудобно
 
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2021
Сообщения
521
Реакции[?]
53
Поинты[?]
20K
Либо делаешь шейдером, либо на каждую букву выделяешь свой цвет.
Шейдер градиентной маски (4 цвета) с тенасити:
Код:
#version 120

uniform vec2 location, rectSize;
uniform sampler2D tex;
uniform vec3 color1, color2, color3, color4;
uniform float alpha;

#define NOISE .5/255.0

vec3 createGradient(vec2 coords, vec3 color1, vec3 color2, vec3 color3, vec3 color4){
    vec3 color = mix(mix(color1.rgb, color2.rgb, coords.y), mix(color3.rgb, color4.rgb, coords.y), coords.x);
    //Dithering the color from https://shader-tutorial.dev/advanced/color-banding-dithering/
    color += mix(NOISE, -NOISE, fract(sin(dot(coords.xy, vec2(12.9898,78.233))) * 43758.5453));
    return color;
}

void main() {
    vec2 coords = (gl_FragCoord.xy - location) / rectSize;
    float texColorAlpha = texture2D(tex, gl_TexCoord[0].st).a;
    gl_FragColor = vec4(createGradient(coords, color1, color2, color3, color4), texColorAlpha * alpha);
}
Если для каждого символа генерировать цвет, то так:
Java:
private static final Pattern GRADIENT_PATTERN = Pattern.compile("<#([0-9A-Fa-f]{6})>(.*?)</#([0-9A-Fa-f]{6})>", Pattern.CASE_INSENSITIVE);
    private static final Pattern HEX_PATTERN = Pattern.compile("<#([A-Fa-f0-9]{6})>");

private static Color[] getGradientColors(Color color1, Color color2, int step) {
        Color[] colors = new Color[step];
        int stepR = Math.abs(color1.getRed() - color2.getRed()) / (step-1);
        int stepG = Math.abs(color1.getGreen() - color2.getGreen()) / (step-1);
        int stepB = Math.abs(color1.getBlue() - color2.getBlue()) / (step-1);

        int[] direction = new int[] {
                color1.getRed() < color2.getRed() ? +1 : -1,
                color1.getGreen() < color2.getGreen() ? +1 : -1,
                color1.getBlue() < color2.getBlue() ? +1 : -1
        };
        for (int i = 0; i < step; i++) {
            Color color = new Color(color1.getRed() + ((stepR * i) * direction[0]), color1.getGreen() + ((stepG * i) * direction[1]), color1.getBlue() + ((stepB * i) * direction[2]));
            colors[i] = color;
        }

        return colors;
    }
step это длина строки. Пример:
Java:
String text = "Текст";
Color[] colors = getGradientColors(Color.RED, Color.ORANGE, text.length()); // Генерируем массив с цветами
char[] chars = text.toCharArray(); // Получем массив из символов (то есть Т, е, к, с, т)

int xOffset = 0;
for (int i = 0; i < characters.length; i++) {
    Color color = colors[i]; // Получаем цвет символа
    char character = chars[i]; // Получаем символ
   
    Fonts.ШРИФТ.drawString(String.valueOf(character), xOffset, 0, color.getRGB()); // Отрисовываем символ
    xOffset += Fonts.ШРИФТ.getStringWidth(String.valueOf(character))+1; // Прибавляем к смещению оси X длину символа + 1
}
Или есть ещё один способ, в загрузку клиента захуярить чтобы картинка с символами (generateFontImage если пасты рича (minced входит)), то вместо g.setColor(Color.WHITE); можно заменить на g.setFill(new GradientFill(...)); но это неудобно
нихуя, неплохо, не ожидал здесь увидеть что-то настолько доработанного и полезного
:roflanEbalo:👍
 
PoC Life
Пользователь
Статус
Оффлайн
Регистрация
22 Авг 2022
Сообщения
319
Реакции[?]
45
Поинты[?]
35K
Сверху Снизу