Crea efectos de texto animados con ItemsAdder
Los shaders GLSL (OpenGL Shading Language) son programas que se ejecutan en la GPU para procesar gráficos. En Minecraft con ItemsAdder, se utilizan para crear efectos visuales personalizados en el texto del chat, nombres de rangos, y otros elementos de UI mediante códigos de color especiales.
Los efectos se activan usando códigos de color hexadecimales especiales. Por ejemplo:
#F0F008 + texto → Activa el efecto arcoíris fractal#F0F01C + texto → Activa el efecto arcoíris#F0F02C + texto → Activa el efecto de fuegoEl sistema convierte estos códigos RGB a efectos shader automáticamente.
Estos shaders permiten crear efectos como:
Un resource pack con shaders para ItemsAdder debe seguir esta estructura. Los shaders se colocan en assets/minecraft/shaders/ y los archivos de configuración de efectos en include/:
Define la versión del resource pack:
{
"pack": {
"pack_format": 15,
"description": "Mi Resource Pack con Shaders"
}
}Este archivo conecta los shaders con el texto de Minecraft y define las variables uniformes necesarias:
{
"blend": {
"func": "add",
"srcrgb": "srcalpha",
"dstrgb": "1-srcalpha"
},
"vertex": "rendertype_text",
"fragment": "rendertype_text",
"attributes": ["Position", "Color", "UV0", "UV2"],
"samplers": [
{ "name": "Sampler0" },
{ "name": "Sampler2" }
],
"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": "ColorModulator",
"type": "float",
"count": 4,
"values": [1.0, 1.0, 1.0, 1.0]
},
{ "name": "FogStart", "type": "float", "count": 1, "values": [0.0] },
{ "name": "FogEnd", "type": "float", "count": 1, "values": [1.0] },
{
"name": "FogColor",
"type": "float",
"count": 4,
"values": [0.0, 0.0, 0.0, 0.0]
},
{ "name": "GameTime", "type": "float", "count": 1, "values": [0.0] },
{ "name": "ScreenSize", "type": "float", "count": 2, "values": [1.0, 1.0] }
]
}Los shaders fragment procesan cada píxel individualmente. Aquí está la estructura básica:
// Version de GLSL que usaremos
#version 150
// Variables de entrada
uniform sampler2D Sampler0;
uniform float GameTime;
// Coordenadas de textura del fragmento actual
in vec2 texCoord0;
in vec4 vertexColor;
// Color de salida del píxel
out vec4 fragColor;
void main() {
// Obtener el color del texto original
vec4 color = texture(Sampler0, texCoord0);
// Aquí va tu efecto personalizado
// Asignar el color final
fragColor = color;
}GameTime - Tiempo de juego (incrementa continuamente, perfecto para animaciones)texCoord0 - Coordenadas UV del píxel actual (0.0 a 1.0)vertexColor - Color del texto originalSampler0 - Textura del textoEste shader crea un efecto de arcoíris que se mueve horizontalmente:
#version 150
uniform sampler2D Sampler0;
uniform float GameTime;
in vec2 texCoord0;
in vec4 vertexColor;
out vec4 fragColor;
// Función para convertir HSV a RGB
vec3 hsv2rgb(vec3 c) {
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}
void main() {
vec4 color = texture(Sampler0, texCoord0);
// Calcular el tono basado en posición y tiempo
float hue = fract(texCoord0.x + GameTime * 0.5);
// Convertir a RGB (saturación: 1.0, valor: 1.0)
vec3 rainbow = hsv2rgb(vec3(hue, 1.0, 1.0));
// Aplicar el color arcoíris al texto
fragColor = vec4(rainbow * color.rgb, color.a);
}texCoord0.x - Posición horizontal del píxel (0 = izquierda, 1 = derecha)GameTime * 0.5 - Velocidad de animación (ajusta el 0.5 para más rápido/lento)fract() - Obtiene solo la parte decimal, creando el ciclo continuohsv2rgb() - Convierte el tono (hue) a colores RGB visiblesShader que crea un efecto ondulante con cambios de color:
#version 150
uniform sampler2D Sampler0;
uniform float GameTime;
in vec2 texCoord0;
in vec4 vertexColor;
out vec4 fragColor;
void main() {
vec4 color = texture(Sampler0, texCoord0);
// Crear efecto de onda usando seno
float wave = sin(texCoord0.x * 10.0 + GameTime * 3.0) * 0.5 + 0.5;
// Colores para interpolar
vec3 color1 = vec3(0.0, 1.0, 1.0); // Cyan
vec3 color2 = vec3(1.0, 0.0, 1.0); // Magenta
// Mezclar colores según la onda
vec3 finalColor = mix(color1, color2, wave);
fragColor = vec4(finalColor * color.rgb, color.a);
}Shader que hace que el texto brille y pulse:
#version 150
uniform sampler2D Sampler0;
uniform float GameTime;
in vec2 texCoord0;
in vec4 vertexColor;
out vec4 fragColor;
void main() {
vec4 color = texture(Sampler0, texCoord0);
// Crear pulsación usando seno
float pulse = sin(GameTime * 2.0) * 0.3 + 1.0;
// Color base brillante (verde neón)
vec3 glowColor = vec3(0.0, 1.0, 0.5);
// Aplicar brillo y pulsación
vec3 finalColor = glowColor * pulse;
fragColor = vec4(finalColor * color.rgb, color.a);
}Crear un gradiente de dos colores específicos:
#version 150
uniform sampler2D Sampler0;
uniform float GameTime;
in vec2 texCoord0;
in vec4 vertexColor;
out vec4 fragColor;
void main() {
vec4 color = texture(Sampler0, texCoord0);
// Define tus colores (RGB de 0.0 a 1.0)
vec3 colorInicio = vec3(1.0, 0.0, 0.0); // Rojo
vec3 colorFin = vec3(0.0, 0.0, 1.0); // Azul
// Interpolar según posición horizontal
vec3 gradient = mix(colorInicio, colorFin, texCoord0.x);
fragColor = vec4(gradient * color.rgb, color.a);
}#FF5500 → R: 255/255 = 1.0, G: 85/255 ≈ 0.33, B: 0/255 = 0.0vec3(1.0, 0.33, 0.0)Los efectos se configuran en el archivo text_effects_config.glsl usando la macro TEXT_EFFECT(R, G, B). Cada combinación RGB activa un efecto específico:
// Example: Rainbow fractal effect
TEXT_EFFECT(240, 240, 8) {
apply_iterating_movement(2.5, 1.0); // 2x faster
apply_rainbow_fractal();
apply_rainbow_abberation(0.42, 0.84); // speed and intensity
apply_shimmer(0.6, 0.45);
textData.shouldScale = true;
}
// Example: Simple rainbow effect
TEXT_EFFECT(240, 240, 28) {
apply_rainbow();
}
// Example: Fire effect
TEXT_EFFECT(240, 240, 44) {
apply_fire();
apply_fade(rgb(238, 121, 12));
textData.shouldScale = true;
}Para aplicar un efecto, usa el código hexadecimal que corresponde al RGB definido:
TEXT_EFFECT(240, 240, 8) → #F0F008TEXT_EFFECT(240, 240, 28) → #F0F01CTEXT_EFFECT(240, 240, 44) → #F0F02CCada componente RGB se convierte a hexadecimal: 240 = F0, 8 = 08, 28 = 1C, 44 = 2C
# Example in LuckPerms or chat plugin
prefix: "#F0F008[VIP]" # Rainbow fractal effect
suffix: "#F0F02C✨" # Fire effect
# Complete message format
format: "{prefix} {username}: #F0F01C{message}" # Rainbow textPara aplicar efectos en items de ItemsAdder, usa el parámetro color:
info:
namespace: myitems
font_images:
rank_vip:
permission: "myserver.rank.vip"
show_in_gui: false
suggest_in_command: true
path: "vip.png"
scale_ratio: 9
y_position: 8
color: "#F0F02C" # Fire effect| Código Hex | RGB | Efecto | Descripción |
|---|---|---|---|
#F0F008 | 240,240,8 | Arcoíris Fractal | Efecto arcoíris con movimiento y brillo |
#F0F01C | 240,240,28 | Arcoíris Simple | Efecto arcoíris básico |
#F0F02C | 240,240,44 | Fuego | Efecto de fuego con desvanecimiento |
#F0F040 | 240,240,64 | Brillo (Shimmer) | Efecto de brillo pulsante |
#F0F014 | 240,240,20 | Contorno Rojo | Texto rojo con contorno morado |
#F0F018 | 240,240,24 | Gradiente Amarillo-Rojo | Gradiente suave de amarillo a rojo |
| Código Hex | Nombre | Colores |
|---|---|---|
#F0F064 | Verde | Verde neón → Verde claro |
#F0F068 | Azul | Azul oscuro → Azul cielo |
#F0F06C | Amarillo | Naranja → Amarillo brillante |
#F0F070 | Púrpura | Púrpura oscuro → Rosa violeta |
#F0F074 | Rosa | Rosa intenso → Rosa claro |
#F0F078 | Rojo | Rojo sangre → Rojo coral |
#F0F01CArcoíris simple
#F0F02CEfecto de fuego
#F0F040Brillo animado
Selecciona valores RGB que no estén en uso. Recomendado: usar 240,240,X donde X es un número par entre 0-255.
Abre el archivo assets/minecraft/shaders/include/text_effects_config.glsl y añade tu efecto:
TEXT_EFFECT(240, 240, 200) {
apply_animated_gradient_3(
rgb(255, 0, 0), // Red
rgb(0, 255, 0), // Green
rgb(0, 0, 255) // Blue
);
textData.shouldScale = true;
}240,240,200 → #F0F0C8 (F0 = 240, C8 = 200)
Ejecuta /iazip en el servidor para empaquetar el resource pack.
Usa el código en el chat: #F0F0C8Mi texto con efecto
Puedes combinar efectos creando shaders más complejos:
// Arcoíris + Pulsación
float pulse = sin(GameTime * 2.0) * 0.2 + 1.0;
float hue = fract(texCoord0.x + GameTime * 0.5);
vec3 rainbow = hsv2rgb(vec3(hue, 1.0, 1.0)) * pulse;const para valores que no cambianSi tu shader no funciona:
#version 150Empieza con un shader simple y experimenta con diferentes valores.
La creatividad es el límite.