• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Визуальная часть Закругление головы шейдером в TargetHUD

  • Автор темы Автор темы Ksafik
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
5 Ноя 2023
Сообщения
232
Реакции
0
Выберите загрузчик игры
  1. Vanilla
  2. OptiFine
  3. Прочие моды
Такого на форуме не замечал, решил слить

ПРИМЕЧАНИЕ!!! Я ИСПОЛЬЗУЮ EXPENSIVE 3.1 НО ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ЛЮБУЮ БАЗУ НА 1.16.5

Преимущество рендера головы именно так - нету глупых мини пропастей на углах головы, голова более лучше и гибче закругляется, оптимизация

Для начала по пути (im\expensive\utils\shader\shaders) создаем класс HeadGlsl и пишем туда следующее:

|
HeadGlsl.java:
Expand Collapse Copy
package im.expensive.utils.shader.shaders;

import im.expensive.utils.shader.IShader;

public class HeadGlsl implements IShader {

    [USER=1367676]@override[/USER]
    public String glsl() {
        return """
                        #version 120
                                                    
                        uniform sampler2D texture;
                        uniform vec2 size;
                        uniform float radius;
                        uniform float hurt_time;
                        uniform float alpha;
                        uniform float startX, endX;
                        uniform float startY, endY;
                                                    
                        uniform float texXSize;
                        uniform float texYSize;
                                                    
                        float signedDistanceField(vec2 p, vec2 b, float r) {
                            return length(max(abs(p) - b, 0.0)) - r;
                        }
                                                    
                        void main() {
                            vec2 tex = gl_TexCoord[0].st;
                            vec2 clippedTexCoord = vec2(
                            mix(startX / texXSize, endX / texXSize, tex.x),
                            mix(startY / texYSize, endY / texYSize, tex.y)
                            );
                            vec4 smpl = texture2D(texture, clippedTexCoord);
                            vec2 pixel = tex * size;
                            vec2 centre = 0.5 * size;
                            float sa = smoothstep(0.0, 1, signedDistanceField(centre - pixel, centre - radius - 1, radius));
                            vec4 c = mix(vec4(smpl.rgb, smpl.a), vec4(smpl.rgb, 0), sa);
                            gl_FragColor = vec4(mix(smpl.rgb, vec3(1.0, 0.0, 0.0), hurt_time), c.a * alpha);
                        }""";
    }

}

далее идем в класс ShaderUtil (или похожий) и пишем туда следующее:

там где список ваших шейдеров (ниже будет скрин примера)

1742662599873.png

добавляем строку:
Код:
Expand Collapse Copy
 public static ShaderUtil head = new ShaderUtil("round-head");

далее в классе Shaders добавляем строку (куда добавить будет скрин ниже)

1742662740407.png


добавляем сюда:

Код:
Expand Collapse Copy
    @Getter
    private IShader head = new HeadGlsl();

Далее идем туда где рендерится ваш таргет худ и вместо строк с рендером головы пишем:

Код:
Expand Collapse Copy
float hurtPercent = (entity.hurtTime - (entity.hurtTime != 0 ? mc.timer.renderPartialTicks : 0.0f)) / 10.0f;
String rs = EntityType.getKey(((Entity)entity).getType()).getPath();
ResourceLocation skin = entity instanceof AbstractClientPlayerEntity e ? (e).getLocationSkin() : new ResourceLocation("textures/entity/"+rs+".png");
RenderUtil.drawHead(skin, posX, posY, headSize + 5, headSize + 5, 4, 1, hurtPercent);
 
Если я что то забыл пишите в лс на форуме или сюда под тему
 
Такого на форуме не замечал, решил слить

ПРИМЕЧАНИЕ!!! Я ИСПОЛЬЗУЮ EXPENSIVE 3.1 НО ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ЛЮБУЮ БАЗУ НА 1.16.5

Преимущество рендера головы именно так - нету глупых мини пропастей на углах головы, голова более лучше и гибче закругляется, оптимизация

Для начала по пути (im\expensive\utils\shader\shaders) создаем класс HeadGlsl и пишем туда следующее:

|
HeadGlsl.java:
Expand Collapse Copy
package im.expensive.utils.shader.shaders;

import im.expensive.utils.shader.IShader;

public class HeadGlsl implements IShader {

    [USER=1367676]@override[/USER]
    public String glsl() {
        return """
                        #version 120
                                                    
                        uniform sampler2D texture;
                        uniform vec2 size;
                        uniform float radius;
                        uniform float hurt_time;
                        uniform float alpha;
                        uniform float startX, endX;
                        uniform float startY, endY;
                                                    
                        uniform float texXSize;
                        uniform float texYSize;
                                                    
                        float signedDistanceField(vec2 p, vec2 b, float r) {
                            return length(max(abs(p) - b, 0.0)) - r;
                        }
                                                    
                        void main() {
                            vec2 tex = gl_TexCoord[0].st;
                            vec2 clippedTexCoord = vec2(
                            mix(startX / texXSize, endX / texXSize, tex.x),
                            mix(startY / texYSize, endY / texYSize, tex.y)
                            );
                            vec4 smpl = texture2D(texture, clippedTexCoord);
                            vec2 pixel = tex * size;
                            vec2 centre = 0.5 * size;
                            float sa = smoothstep(0.0, 1, signedDistanceField(centre - pixel, centre - radius - 1, radius));
                            vec4 c = mix(vec4(smpl.rgb, smpl.a), vec4(smpl.rgb, 0), sa);
                            gl_FragColor = vec4(mix(smpl.rgb, vec3(1.0, 0.0, 0.0), hurt_time), c.a * alpha);
                        }""";
    }

}

далее идем в класс ShaderUtil (или похожий) и пишем туда следующее:

там где список ваших шейдеров (ниже будет скрин примера)

Посмотреть вложение 301807
добавляем строку:
Код:
Expand Collapse Copy
 public static ShaderUtil head = new ShaderUtil("round-head");

далее в классе Shaders добавляем строку (куда добавить будет скрин ниже)

Посмотреть вложение 301808

добавляем сюда:

Код:
Expand Collapse Copy
    @Getter
    private IShader head = new HeadGlsl();

Далее идем туда где рендерится ваш таргет худ и вместо строк с рендером головы пишем:

Код:
Expand Collapse Copy
float hurtPercent = (entity.hurtTime - (entity.hurtTime != 0 ? mc.timer.renderPartialTicks : 0.0f)) / 10.0f;
String rs = EntityType.getKey(((Entity)entity).getType()).getPath();
ResourceLocation skin = entity instanceof AbstractClientPlayerEntity e ? (e).getLocationSkin() : new ResourceLocation("textures/entity/"+rs+".png");
RenderUtil.drawHead(skin, posX, posY, headSize + 5, headSize + 5, 4, 1, hurtPercent);
Xd,у меня закругляется шейдером от обычного ректа,без текстуры.Кстати утилку забыл ты дать.
 
шейдер утил же есть в экспе по дефолту
из за такого закрцгления (которое ты написал ShadowSystem) -оптимизация и на углах пробелы маленькие которые при сильном закруглении сильно видно
 
шейдер утил же есть в экспе по дефолту
из за такого закрцгления (которое ты написал ShadowSystem) -оптимизация и на углах пробелы маленькие которые при сильном закруглении сильно видно
Скинь
 
Скинь рендерутил
 
сказал тип который снял сабку за то что я сказал что то про клиент (когда я написал "за что" ты ответил "за россию")
Скрытое содержимое
static ShaderUtil head = new ShaderUtil("round-head");
public static void drawHead(ResourceLocation skin,float x, float y, float width, float height, float radius, float alpha, float hurtPercent){
mc.getTextureManager().bindTexture(skin); // биндим текстуру головы игрока
RenderSystem.pushMatrix();
RenderSystem.enableBlend();
head.attach(); // атачим шейдер для рендера
head.setUniformf("size", width,height); //ставим размер головы
head.setUniformf("radius", radius); // ставим закругление головы
head.setUniformf("hurt_time", hurtPercent); //дамаг энтити (красное затемнение)
head.setUniformf("alpha", alpha); // прозрачность

head.setUniformf("startX", 4); // не менять
head.setUniformf("startY", 4); // тоже не менять

head.setUniformf("endX", 8); // опять не менять
head.setUniformf("endY", 8); //не менять

head.setUniformf("texXSize", 32); //размер текстурки (НЕ МЕНЯТЬ)
head.setUniformf("texYSize", 32); //не менять тоже размер текстурки
head.drawQuads(x+2, y+2, width, height); //рисуем голову на координатах
head.detach(); // детачим шейдер чтобы gl11 нас не бом бомнул
RenderSystem.disableBlend();
RenderSystem.popMatrix();
}

и еще добавь в шейдер утилке вот тут:
1742888642982.png


вот это:
case "round-head" -> createShader(Shaders.getInstance().getHead(), GL_FRAGMENT_SHADER);
 
зря слил
 
сказал тип который снял сабку за то что я сказал что то про клиент (когда я написал "за что" ты ответил "за россию")

static ShaderUtil head = new ShaderUtil("round-head");
public static void drawHead(ResourceLocation skin,float x, float y, float width, float height, float radius, float alpha, float hurtPercent){
mc.getTextureManager().bindTexture(skin); // биндим текстуру головы игрока
RenderSystem.pushMatrix();
RenderSystem.enableBlend();
head.attach(); // атачим шейдер для рендера
head.setUniformf("size", width,height); //ставим размер головы
head.setUniformf("radius", radius); // ставим закругление головы
head.setUniformf("hurt_time", hurtPercent); //дамаг энтити (красное затемнение)
head.setUniformf("alpha", alpha); // прозрачность

head.setUniformf("startX", 4); // не менять
head.setUniformf("startY", 4); // тоже не менять

head.setUniformf("endX", 8); // опять не менять
head.setUniformf("endY", 8); //не менять

head.setUniformf("texXSize", 32); //размер текстурки (НЕ МЕНЯТЬ)
head.setUniformf("texYSize", 32); //не менять тоже размер текстурки
head.drawQuads(x+2, y+2, width, height); //рисуем голову на координатах
head.detach(); // детачим шейдер чтобы gl11 нас не бом бомнул
RenderSystem.disableBlend();
RenderSystem.popMatrix();
}

и еще добавь в шейдер утилке вот тут:
Посмотреть вложение 302046

вот это:
case "round-head" -> createShader(Shaders.getInstance().getHead(), GL_FRAGMENT_SHADER);
Мой слоняра ZOV!
 
Назад
Сверху Снизу