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

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

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
21 Май 2024
Сообщения
45
Реакции
11
Выберите загрузчик игры
  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)
            );
 
Назад
Сверху Снизу