мне нужно создать ванильный шейдер майнкрафт котор...

تم الإنشاء في: ١٤ أبريل ٢٠٢٦

تمت الإجابة باستخدام GPT-5.4 Thinking بواسطة Chat01

سؤال

мне нужно создать ванильный шейдер майнкрафт который делает символ "заблюреным" и чуть прозрачным если на нём фонт ttf. это можно сделать через rendertype_text_inline или как-то так. сделай

الفكرة

Сделаю готовый вариант под vanilla-шэйдерный пайплайн Minecraft и подскажу, куда именно его положить. Сразу ориентируюсь на вариант для текста через rendertype_text / rendertype_text_intensity, а не на общий пост-эффект, чтобы блюр и прозрачность касались именно глифов.

Thought for 12s

الفكرة

undefined

الفكرة

undefined

الفكرة

undefined

الفكرة

undefined

الفكرة

undefined

الفكرة

undefined

الفكرة

undefined

الفكرة

undefined

الفكرة

Providing shader variants and file structure

I’ve created different shader variants, like the intensity and see-through variants with and without fog. These shaders structure nicely and work for various scenarios. I’ll list the shader files used — rendertype_text.fsh, rendertype_text_intensity.fsh, etc. Also, I’ll reference font JSON files and a TTF provider.

Thought for 5m 38s

الإجابة

Да — в 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)

Структура пака получится такая:

text
assets/ 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.

مشاركة هذا السؤال والجواب