мне нужно создать ванильный шейдер майнкрафт котор...
बनाया गया: 14 अप्रैल 2026
का उपयोग करके उत्तर दिया गया GPT-5.4 Thinking द्वारा Chat01
बनाया गया: 14 अप्रैल 2026
का उपयोग करके उत्तर दिया गया GPT-5.4 Thinking द्वारा Chat01
мне нужно создать ванильный шейдер майнкрафт который делает символ "заблюреным" и чуть прозрачным если на нём фонт ttf. это можно сделать через rendertype_text_inline или как-то так. сделай
Да — в vanilla это делается через переопределение core text shaders, то есть через rendertype_text*, а не через rendertype_text_inline. В актуальных ассетах есть rendertype_text, rendertype_text_intensity и ..._see_through; начиная с 1.21.5 JSON-описания core shader’ов убрали, но сами .fsh/.vsh всё ещё можно override’ить ресурс-паком. (minecraftvanilla.net)
Главный нюанс: чистый shader не знает, “это TTF-глиф или bitmap-глиф”. Он видит только уже растеризованный atlas и альфу текстуры. Поэтому надёжно проверять именно тип font provider нельзя; рабочий обходной путь — усилить blur на полупрозрачных краях, а такие края как раз характерны для TTF с anti-aliasing/oversample. (MC Assets)
Ниже готовый вариант под ветку 1.21.5.
assets/minecraft/shaders/core/rendertype_text.fsh
glsl#version 150 #moj_import <minecraft:fog.glsl> uniform sampler2D Sampler0; uniform vec4 ColorModulator; uniform float FogStart; uniform float FogEnd; uniform vec4 FogColor; in float vertexDistance; in vec4 vertexColor; in vec2 texCoord0; out vec4 fragColor; vec4 sampleGlyph(vec2 uv) { return texture(Sampler0, uv); } void main() { vec2 texel = 1.0 / vec2(textureSize(Sampler0, 0)); vec4 base = sampleGlyph(texCoord0); vec4 blur = base * 0.40 + sampleGlyph(texCoord0 + vec2(texel.x, 0.0)) * 0.15 + sampleGlyph(texCoord0 - vec2(texel.x, 0.0)) * 0.15 + sampleGlyph(texCoord0 + vec2(0.0, texel.y)) * 0.15 + sampleGlyph(texCoord0 - vec2(0.0, texel.y)) * 0.15; // Сильнее цепляем полупрозрачные края — это визуально "TTF-like" float softEdge = smoothstep(0.02, 0.40, base.a) * (1.0 - smoothstep(0.60, 0.98, base.a)); float blurAmount = 0.10 + softEdge * 0.55; vec4 glyph = mix(base, blur, blurAmount); // Чуть прозрачнее if (base.a > 0.0) { glyph.a *= 0.93; } // Ещё сильнее ослабляем мягкие края glyph.a *= mix(1.0, 0.88, softEdge); vec4 color = glyph * vertexColor * ColorModulator; if (color.a < 0.1) { discard; } fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); }
assets/minecraft/shaders/core/rendertype_text_intensity.fsh
glsl#version 150 #moj_import <minecraft:fog.glsl> uniform sampler2D Sampler0; uniform vec4 ColorModulator; uniform float FogStart; uniform float FogEnd; uniform vec4 FogColor; in float vertexDistance; in vec4 vertexColor; in vec2 texCoord0; out vec4 fragColor; vec4 sampleGlyph(vec2 uv) { float r = texture(Sampler0, uv).r; return vec4(r, r, r, r); } void main() { vec2 texel = 1.0 / vec2(textureSize(Sampler0, 0)); vec4 base = sampleGlyph(texCoord0); vec4 blur = base * 0.40 + sampleGlyph(texCoord0 + vec2(texel.x, 0.0)) * 0.15 + sampleGlyph(texCoord0 - vec2(texel.x, 0.0)) * 0.15 + sampleGlyph(texCoord0 + vec2(0.0, texel.y)) * 0.15 + sampleGlyph(texCoord0 - vec2(0.0, texel.y)) * 0.15; float softEdge = smoothstep(0.02, 0.40, base.a) * (1.0 - smoothstep(0.60, 0.98, base.a)); float blurAmount = 0.10 + softEdge * 0.55; vec4 glyph = mix(base, blur, blurAmount); if (base.a > 0.0) { glyph.a *= 0.93; } glyph.a *= mix(1.0, 0.88, softEdge); vec4 color = glyph * vertexColor * ColorModulator; if (color.a < 0.1) { discard; } fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); }
Для текста без fog/с see_through положи такие же версии ещё и сюда: rendertype_text_see_through.fsh и rendertype_text_intensity_see_through.fsh. У этих vanilla-вариантов та же текстовая выборка, только без fog-прохода. (MC Assets)
Если у тебя TTF подключён через font/default.json, базовая схема такая:
json{ "providers": [ { "type": "ttf", "file": "minecraft:myfont.ttf", "shift": [0, 0], "size": 11, "oversample": 2, "skip": "" } ] }
У ttf-provider есть size, shift, oversample и skip; oversample как раз влияет на антиалиасинг, так что вместе с этим shader’ом эффект обычно выглядит лучше на TTF, чем на bitmap-шрифтах. (Minecraft Wiki)
Структура пака получится такая:
textassets/ minecraft/ font/ default.json myfont.ttf shaders/ core/ rendertype_text.fsh rendertype_text_intensity.fsh rendertype_text_see_through.fsh rendertype_text_intensity_see_through.fsh
Если тебе нужен вариант не “для всего TTF-текста”, а только для одного конкретного символа, то одним shader’ом это не отловить: надо либо вынести этот символ в отдельный font/id, либо делать отдельный atlas/рендер-путь. (MC Assets)
Могу сразу собрать тебе ещё и готовый pack.mcmeta + полную структуру ресурс-пака под твою версию Minecraft.