Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Исходник Скругление текстур - утилита | MCP 1.21.4

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
21 Май 2024
Сообщения
10
Реакции
0
Выберите загрузчик игры
  1. Прочие моды
Не видел чтобы такое сливалось, думаю может кому нибудь будет полезно, юзайте

В классе CoreShaders в объявлении шейдеров добавляете строку
public static final ShaderProgram RENDERTYPE_ROUNDED_TEXTURE = register("rounded_texture", DefaultVertexFormat.POSITION_TEX_COLOR);

В основной папке с шейдерами создаете 3 файла с названием rounded_texture с 3 расширениями .fsh .vsh и .json

В файл rounded_texture.fsh вставляете:
PHP:
Expand Collapse Copy
#version 150

in vec2 FragCoord;
in vec4 FragColor;
in vec2 TexCoord;

uniform sampler2D Sampler0;
uniform vec2 Size;
uniform vec4 Radius;
uniform float Smoothness;

out vec4 OutColor;

float rdist(vec2 pos, vec2 size, vec4 radius) {
    radius.xy = (pos.x > 0.0) ? radius.xy : radius.wz;
    radius.x  = (pos.y > 0.0) ? radius.x : radius.y;
    
    vec2 v = abs(pos) - size + radius.x;
    return min(max(v.x, v.y), 0.0) + length(max(v, 0.0)) - radius.x;
}

float ralpha(vec2 size, vec2 coord, vec4 radius, float smoothness) {
    vec2 center = size * 0.5;
    float dist = rdist(center - (coord * size), center - 1.0, radius);
    return 1.0 - smoothstep(1.0 - smoothness, 1.0, dist);
}

void main() {
    vec4 texColor = texture(Sampler0, TexCoord);
    float alpha = ralpha(Size, FragCoord, Radius, Smoothness);
    vec4 color = vec4(texColor.rgb * FragColor.rgb, texColor.a * FragColor.a * alpha);

    if (color.a < 0.01) {
        discard;
    }

    OutColor = color;
}

В файл rounded_texture.vsh вставляете:
PHP:
Expand Collapse Copy
#version 150

in vec3 Position;
in vec4 Color;
in vec2 UV0;

uniform mat4 ModelViewMat;
uniform mat4 ProjMat;

out vec2 FragCoord;
out vec4 FragColor;
out vec2 TexCoord;

const vec2[4] RECT_VERTICES_COORDS = vec2[] (
    vec2(0.0, 0.0),
    vec2(0.0, 1.0),
    vec2(1.0, 1.0),
    vec2(1.0, 0.0)
);

vec2 rvertexcoord(int id) {
    return RECT_VERTICES_COORDS[id % 4];
}

void main() {
    FragCoord = rvertexcoord(gl_VertexID);
    FragColor = Color;
    TexCoord = UV0;

    gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0);
}
В файл rounded_texture.json вставляете:
JSON:
Expand Collapse Copy
{
    "vertex": "minecraft:core/rounded_texture",
    "fragment": "minecraft:core/rounded_texture",
    "samplers": [
        { "name": "Sampler0" }
    ],
    "uniforms": [
        { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
        { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
        { "name": "Size", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] },
        { "name": "Radius", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] },
        { "name": "Smoothness", "type": "float", "count": 1, "values": [ 1.0 ] }
    ]
}

Далее заходите в свою рендер утилку и добавляете метод:
Java:
Expand Collapse Copy
public static void drawRoundedTexture(PoseStack poseStack, ResourceLocation texture,
                                          float x, float y, float width, float height,
                                          float radius, int color) {
        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.setShaderTexture(0, texture);

        Matrix4f matrix4f = poseStack.last().pose();
        CompiledShaderProgram shader = RenderSystem.setShader(CoreShaders.RENDERTYPE_ROUNDED_TEXTURE);

        shader.getUniform("Size").set(width, height);
        shader.getUniform("Radius").set(radius, radius, radius, radius);
        shader.getUniform("Smoothness").set(1.5f);

        BufferBuilder builder = Tesselator.getInstance().begin(
                VertexFormat.Mode.QUADS,
                DefaultVertexFormat.POSITION_TEX_COLOR
        );

        float r = ((color >> 16) & 0xFF) / 255f;
        float g = ((color >> 8) & 0xFF) / 255f;
        float b = (color & 0xFF) / 255f;
        float a = ((color >> 24) & 0xFF) / 255f;

        float u0 = 8f / 64f;
        float v0 = 8f / 64f;
        float u1 = 16f / 64f;
        float v1 = 16f / 64f;

        builder.addVertex(matrix4f, x, y + height, 0).setColor(r, g, b, a).setUv(u0, v1);
        builder.addVertex(matrix4f, x + width, y + height, 0).setColor(r, g, b, a).setUv(u1, v1);
        builder.addVertex(matrix4f, x + width, y, 0).setColor(r, g, b, a).setUv(u1, v0);
        builder.addVertex(matrix4f, x, y, 0).setColor(r, g, b, a).setUv(u0, v0);

        BufferUploader.drawWithShader(builder.buildOrThrow());
        RenderSystem.disableBlend();
    }

В целом все, далее вызываете уже где вам надо, идеально подойдет для скруглении головы в таргетхуде например
Java:
Expand Collapse Copy
            PlayerSkin skin = player.getSkin();

            RenderUtility.drawRoundedTexture(
                    IBased.getPoseStack(),
                    skin.texture(),
                    x + 4, y + 4, 27, 27,
                    4,
                    ColorUtil.setAlpha(-1, alpha)
            );
 
Назад
Сверху Снизу