Начинающий
- Статус
- Оффлайн
- Регистрация
- 21 Май 2024
- Сообщения
- 10
- Реакции
- 0
- Выберите загрузчик игры
- Прочие моды
Не видел чтобы такое сливалось, думаю может кому нибудь будет полезно, юзайте
В классе CoreShaders в объявлении шейдеров добавляете строку
В основной папке с шейдерами создаете 3 файла с названием rounded_texture с 3 расширениями .fsh .vsh и .json
В файл rounded_texture.fsh вставляете:
В классе 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:
#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:
#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:
{
"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:
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:
PlayerSkin skin = player.getSkin();
RenderUtility.drawRoundedTexture(
IBased.getPoseStack(),
skin.texture(),
x + 4, y + 4, 27, 27,
4,
ColorUtil.setAlpha(-1, alpha)
);